CSocket接收数据只接收到第一个字符

pull1978 2010-07-25 11:30:32
很简单的例子,结果每次都只能接收到第一个字符,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"
...全文
287 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zen星尘 2012-07-30
  • 打赏
  • 举报
回复
mark一下,以后遇到这问题就会了
lijianli9 2010-07-26
  • 打赏
  • 举报
回复
使用 WideCharToMultiByte和MultiByteToWideChar进行宽字符和字符的转换。
pull1978 2010-07-26
  • 打赏
  • 举报
回复
如楼上各位所说,客户端把CString转换为char*之后再进行发送就ok了
服务端直接接受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通过
感谢各位,马上结贴
pull1978 2010-07-25
  • 打赏
  • 举报
回复
char的情况
发送abc和abcd变成 a 0 b 0
发送abcde和abcdef变成a 0 b 0 c 0
发送abcdefg和abcdefgh变成a 0 b 0 c 0 d 0

wchar_t的情况
发送abc和abcd变成 ab
发送abcde和abcdef变成abc
发送abcdefg和abcdefgh变成abcd

总之发送n个字符
接收到得就是n/2然后四舍五入
pull1978 2010-07-25
  • 打赏
  • 举报
回复
还是不对
如果是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个字符?
如果是中文,就变成前两个半中文了......
xhzxlqt 2010-07-25
  • 打赏
  • 举报
回复
楼上正解。
char[]当遇到0时表示结束。
对于ASCII UNICODE编码时,第二字节正好为0;
你可以将发送内容改为中文就会发现接收正常
arong1234 2010-07-25
  • 打赏
  • 举报
回复
你发送用的是unicode,接受方也必须用unicode处理。使用wchar_t来处理,不能用char
pull1978 2010-07-25
  • 打赏
  • 举报
回复
发送abc
接收到的msg是
msg[0]='a'
msg[1]='\0'
msg[2]='b'
msg[3]='\0'
........
..............
pull1978 2010-07-25
  • 打赏
  • 举报
回复
CScoket怎么会没有Create呢
也有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,很奇怪
m_tornado 2010-07-25
  • 打赏
  • 举报
回复
你的CSocket用的很不一般,也没有Create,据我查msdn也没有Socket()的成员函数,你是自己封装过一次弄的么~
晒月光的青蛙 2010-07-25
  • 打赏
  • 举报
回复
很奇怪,没遇到过,帮顶
  • 打赏
  • 举报
回复
关注!
言之有宜 2010-07-25
  • 打赏
  • 举报
回复
关注中
来灵 2010-07-25
  • 打赏
  • 举报
回复
如果你想继续用UNICODE环境,在客户端发送之前,先用WideCharToMultiByte将要发送的内容转换成ANSI格式的,再发送。服务端接收到后,用MultiByteToWideChar将接收到的内容再转成宽字节的,试试看
iqyely 2010-07-25
  • 打赏
  • 举报
回复
来关注下。
xhzxlqt 2010-07-25
  • 打赏
  • 举报
回复
发送和接收时,建议使用struct,强制转换成PBYTE发送,变长的在struct中指明附加数据长度
接收时验证长度
struct
{
UINT 操作类型;
UINT 附加数据长度;
};
发送时:struct+附加数据
接收时:接收数据长度>=sizeof(struct),接收数据长度-sizeof(struct)应该=struct.附加数据长度

pull1978 2010-07-25
  • 打赏
  • 举报
回复
把项目的字符集改成
“使用多字节字符集”
后解决问题

还是想知道,如果使用原来的unicode字符集,如何解决?
一、实验目的 1.掌握通信规范的制定及实现。 2.练习较复杂的网络编程,能够把协议设计思想应用到现实应用中。 二、实验内容和要求 1.进一步熟悉VC++6编程环境; 2.利用VC++6进行较复杂的网络编程,完成网络聊天室的设计及编写; 三、实验(设计)仪器设备和材料 1.计算机及操作系统:PC机,Windows; 2.网络环境:可以访问互联网; 四、 TCP/IP程序设计基础 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(VC6.0下): 第一部分 服务器端 一、创建服务器套接字(create)。 二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。 三、接受来自用户端的连接请求(accept)。 四、开始数据传输(send/receive)。 五、关闭套接字(closesocket)。 第二部分 客户端 一、创建客户套接字(create)。 二、与远程服务器进行连接(connect),如被接受则创建接收进程。 三、开始数据传输(send/receive)。 四、关闭套接字(closesocket)。 CSocket的编程步骤:(注意我们一定要在创建MFC程序第二步的时候选上Windows Socket选项,其中ServerSocket是服务器端用到的,ClientSocket是客户端用的。) (1)构造CSocket对象,如下例: CSocket ServerSocket; CSocket ClientSocket; (2)CSocket对象的Create函数用来创建Windows Socket,Create()函数会自行调用Bind()函数将此Socket绑定到指定的地址上面。如下例: ServerSocket.Create(823); //服务器端需要指定一个端口号,我们用823。 ClientSocket.Create(); //客户端不用指定端口号。 (3)现在已经创建完基本的Socket对象了,现在我们来启动它,对于服务器端,我们需要这个Socket不停的监听是否有来自于网络上的连接请求,如下例: ServerSocket.Listen(5);//参数5是表示我们的待处理Socket队列中最多能有几个Socket。 (4)对于客户端我们就要实行连接了,具体实现如下例: ClientSocket.Connect(CString SerAddress,Unsinged int SerPort);//其中SerAddress是服务器的IP地址,SerPort是端口号。 (5)服务器是怎么来接受这份连接的呢?它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。如下例: CSocket ReceiveSocket; ServerSocket.Accept(ReceiveSocket); (6)如果想在两个程序之间接收或发送信息,MFC也提供了相应的函数。如下例: ServerSocket.Receive(String,Buffer); //String是你要发送的字符串,Buffer是发送字符串的缓冲区大小。ServerSocket.Send(String,Butter);//String是你要接收字符串,Buffer是接收字符串的缓冲区大小。
<计算机网络实验> 基于TCP的网络聊天室的设计 -实验指导 一、实验目的 1.掌握通信规范的制定及实现。 2.练习较复杂的网络编程,能够把协议设计思想应用到现实应用中。 二、实验内容和要求 1.进一步熟悉VC++6编程环境; 2.利用VC++6进行较复杂的网络编程,完成网络聊天室的设计及编写; 三、实验(设计)仪器设备和材料 1.计算机及操作系统:PC机,Windows; 2.网络环境:可以访问互联网; 四、 TCP/IP程序设计基础 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(VC6.0下): 第一部分 服务器端 一、创建服务器套接字(create)。 二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。 三、接受来自用户端的连接请求(accept)。 四、开始数据传输(send/receive)。 五、关闭套接字(closesocket)。 第二部分 客户端 一、创建客户套接字(create)。 二、与远程服务器进行连接(connect),如被接受则创建接收进程。 三、开始数据传输(send/receive)。 四、关闭套接字(closesocket)。 CSocket的编程步骤:(注意我们一定要在创建MFC程序第二步的时候选上Windows Socket选项,其中ServerSocket是服务器端用到的,ClientSocket是客户端用的。) (1)构造CSocket对象,如下例: CSocket ServerSocket; CSocket ClientSocket; (2)CSocket对象的Create函数用来创建Windows Socket,Create()函数会自行调用Bind()函数将此Socket绑定到指定的地址上面。如下例: ServerSocket.Create(823); //服务器端需要指定一个端口号,我们用823。 ClientSocket.Create(); //客户端不用指定端口号。 (3)现在已经创建完基本的Socket对象了,现在我们来启动它,对于服务器端,我们需要这个Socket不停的监听是否有来自于网络上的连接请求,如下例: ServerSocket.Listen(5);//参数5是表示我们的待处理Socket队列中最多能有几个Socket。 (4)对于客户端我们就要实行连接了,具体实现如下例: ClientSocket.Connect(CString SerAddress,Unsinged int SerPort);//其中SerAddress是服务器的IP地址,SerPort是端口号。 (5)服务器是怎么来接受这份连接的呢?它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。如下例: CSocket ReceiveSocket; ServerSocket.Accept(ReceiveSocket); (6)如果想在两个程序之间接收或发送信息,MFC也提供了相应的函数。如下例: ServerSocket.Receive(String,Buffer); //String是你要发送的字符串,Buffer是发送字符串的缓冲区大小。ServerSocket.Send(String,Butter);//String是你要接收字符串,Buffer是接收字符串的缓冲区大小。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧