菜鸟的SOCKET编程,麻烦大家看一下,为什么不能实现基本的聊天功能
/////////////////////////////////////////////////////// /////////////////////////////////////////////////////// //// 服务器端 //////// /////////////////////////////////////////////////////// ////////////////////////////////////////////////////// #include<stdio.h> #include <WINSOCK2.h> #pragma comment(lib, "Ws2_32.lib") void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockSer=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSer; addrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSer.sin_family=AF_INET; addrSer.sin_port=htons(6000); bind(sockSer,(SOCKADDR*)&sockSer,sizeof(SOCKADDR)); char recvBuf[100]; char tempBuf[100]; char sendBuf[100]; SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { recvfrom(sockSer,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); if('q'==recvBuf[0]) { sendto(sockSer,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len); printf("chat end!n"); break; } sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); printf("%sn",tempBuf); printf("please input data:n"); gets(sendBuf); sendto(sockSer,sendBuf,strlen(tempBuf)+1,0,(SOCKADDR*)&addrClient,len); } closesocket(sockSer); WSACleanup(); } //////////////////////////////////////// /////////////////////////////////////// //////////// 客户端 ////////// ////////////////////////////////////// ////////////////////////////////////// #include<stdio.h> #include <WINSOCK2.h> #pragma comment(lib, "Ws2_32.lib") void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSev; addrSev.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSev.sin_family=AF_INET; addrSev.sin_port=htons(6000); char recvBuf[100]; char sendBuf[100]; char tempBuf[100]; //SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { printf("please input your data:n"); gets(sendBuf); sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSev,len); recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSev,&len); if('q'==recvBuf[0]) { sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSev,len); printf("chat end!n"); break; } sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSev.sin_addr),recvBuf); printf("%sn",tempBuf); } closesocket(sockClient); WSACleanup(); }为什么不能实现基本的聊天功能呢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
好熟悉的代码 tag:孙鑫
恩,不过我不知道孙鑫是干什么啊。。
恩恩,准确的说我接触编程的时间还不长,还是个幼稚的学生。。。好的编程习惯还没养成,所以。。酿成“杯具”。我会好好的学习进步,那本书,马上就去图书馆借
你应该接触网络编程不久吧. 1. UDP 和TCP都简单练习练习, TCP是优于UDP的, UDP编程需要自己写确认方案(相当于在UDP上实现个微型的TCP). 2. 网络套接字有很多模型,你需要熟练. 3. 熟练了之后,直接使用网络库, 自己去使用原始套接字 不如使用别人的开源库,boost:asio,libevent. 一个高效的网络程序需要考虑的太多.网络库能让你省去很多枯燥学习.
推荐经典书籍 <UNIX 网络编程>(UNIX和windows都用的是套接字模型,这本书一样适合win). It's good for you to have a look.
@燕东 : 帮你找出来了. bind(sockSer,(SOCKADDR*)&sockSer,sizeof(SOCKADDR)); 的第2个参数不应该是sockeSer 而应该是地址结构,你写错了. 如果你能检查下bind的返回,或者recvfrom的返回,很快就能追寻到这行代码有问题. 所以你最好把返回值检查加上,哪步成功 哪没成功 都print出来,代码一出问题,就需要这样去做,1分钟不到,问题就能解决.
恩恩,我是刚来的,不知道规矩,发现论坛上原来有这么多热心人,谢谢你,谢谢你们。我是在同一台机器上实验的,这就是书上的一个实例。recvfrom应该是一直等待信息的,可我总是实现不了,我是个菜菜菜菜鸟
嘿嘿
引用来自“JavaGG”的答案
引用来自“狼狼A狗”的答案
试试 Netty !
引用来自“狼狼A狗”的答案
试试 Netty !
不会吧。。MSDN中说就是用htons
addrSev.sin_port=htons(6000);
我怎么记得是用ntohs?
试试 Netty !
这是数据包套接字,不需要listen的