很简单的例子,结果每次都只能接收到第一个字符,123就只收到1,abc就只收到a
服务端CSocket s,c;
AfxSocketInit();
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
s.Socket();
s.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);
s.Bind(33333);
s.Listen(10);
s.Accept(c);
char msg[256]={0};
int recvLen=0;
c.Receive(msg,256);//但是这边只能收到第一个字符,后面的都没了
客户端CSocket c;
AfxSocketInit();
c.Create();
c.Connect(L"127.0.0.1",33333);
CEdit* ed=(CEdit*)this->GetDlgItem(IDC_EDIT_MSG);
CString msg;
ed->GetWindowTextW(msg);
c.Send(msg,msg.GetLength());//跟踪到这里的确是"abc"
服务端CSocket s,c;
AfxSocketInit();
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
s.Socket();
s.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);
s.Bind(33333);
s.Listen(10);
s.Accept(c);
char msg[256]={0};
int recvLen=0;
c.Receive(msg,256);//但是这边只能收到第一个字符,后面的都没了
客户端CSocket c;
AfxSocketInit();
c.Create();
c.Connect(L"127.0.0.1",33333);
CEdit* ed=(CEdit*)this->GetDlgItem(IDC_EDIT_MSG);
CString msg;
ed->GetWindowTextW(msg);
c.Send(msg,msg.GetLength());//跟踪到这里的确是"abc"
也有Socket方法吧
没有封装过
两个方法的定义在afxsock.h里面BOOL Create(UINT nSocketPort = 0, int nSocketType=SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL);BOOL Socket(int nSocketType=SOCK_STREAM, long lEvent =
FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0, int nAddressFormat = PF_INET);另外
如果这样
int recvLen=c.Receive(msg,256);
发送abc过来,msg里面只接收到a
但是recvLen的值却是3,很奇怪
接收到的msg是
msg[0]='a'
msg[1]='\0'
msg[2]='b'
msg[3]='\0'
........
..............
char[]当遇到0时表示结束。
对于ASCII UNICODE编码时,第二字节正好为0;
你可以将发送内容改为中文就会发现接收正常
如果是unicode的问题发送abc
接收到的msg就应该是
msg[0]='a'
msg[1]='\0'
msg[2]='b'
msg[3]='\0'
msg[4]='c'
msg[5]='\0'可是没有'c'啊我改成这样wchar_t msg[256]={0};
int recvLen=0;
c.Receive(msg,256);接收到的信息变成'abcdef'
可是我发送的是'abcdefghijk'只接收前5个字符?
如果是中文,就变成前两个半中文了......
发送abc和abcd变成 a 0 b 0
发送abcde和abcdef变成a 0 b 0 c 0
发送abcdefg和abcdefgh变成a 0 b 0 c 0 d 0wchar_t的情况
发送abc和abcd变成 ab
发送abcde和abcdef变成abc
发送abcdefg和abcdefgh变成abcd总之发送n个字符
接收到得就是n/2然后四舍五入
“使用多字节字符集”
后解决问题还是想知道,如果使用原来的unicode字符集,如何解决?
接收时验证长度
struct
{
UINT 操作类型;
UINT 附加数据长度;
};
发送时:struct+附加数据
接收时:接收数据长度>=sizeof(struct),接收数据长度-sizeof(struct)应该=struct.附加数据长度
服务端直接接受char*即可客户端代码改正如下: CEdit* ed=(CEdit*)this->GetDlgItem(IDC_EDIT_MSG);
CString msg;
ed->GetWindowTextW(msg);
USES_CONVERSION;
char* msg=T2A(msg);
c.Send(ch,strlen(ch));unicode通过
感谢各位,马上结贴