网络编程的问题? 本帖最后由 VisualEleven 于 2011-10-25 23:33:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也遇到过,加个if recvfrom 失败 break;这个问题是由于客户端closeConnection了,recvfrom就一直失败 额,不好意思,这是服务器端的代码:#include <stdio.h>#include <winsock2.h>int main(){ WORD wVersionRequested; WSADATA wsaData; //WSAStartup(1,1); wVersionRequested=MAKEWORD(1,1); int err; err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) return 0; if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return 0; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addSrv; addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addSrv.sin_family=AF_INET; addSrv.sin_port=htons(6000); bind(sockSrv,(sockaddr*)&addSrv,sizeof(SOCKADDR)); listen(sockSrv,5); SOCKADDR_IN addClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(sockaddr*)&addClient,&len); char sendBuf[100]; sprintf(sendBuf,"welcome %s to whitelee's home\n",inet_ntoa(addClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s\n",recvBuf); closesocket(sockConn); } return 0;}下面的是客户端的。#include <stdio.h>#include <winsock2.h>int main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(1,1); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0) return 0; if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1) { WSACleanup(); return 0; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClient; addrClient.sin_addr.S_un .S_addr =inet_addr("192.168.1.2"); addrClient.sin_family=AF_INET; addrClient.sin_port=htons(6000); connect(sockClient,(sockaddr*)&addrClient,sizeof(SOCKADDR)); char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); send(sockClient,"this is lisi",strlen("this is lisi")+1,0); closesocket(sockClient); WSACleanup(); return 0;} bind(sockSrv,(sockaddr*)&addSrv,sizeof(SOCKADDR));和connect(sockClient,(sockaddr*)&addrClient,sizeof(SOCKADDR));最好改成bind(sockSrv,(SOCKADDR_IN*)&addSrv,sizeof(SOCKADDR_IN));和connect(sockClient,(SOCKADDR_IN*)&addrClient,sizeof(SOCKADDR_IN));还有每部的执行你都要加上判断,向bind,send,recv这些方法都可能出错的,你不加判断就很容易导致错误 右键工程,然后选择一个叫,set as setup project...的选项,然后这个工程就是当前的工程了 在SQL2008中用资源管理器展开表的时候提示“请参阅对象资源管理器详细信息”。。。 WebBrowser 设置 DLCTL_SILENT 启用时遇到问题 UPDATA语法出错 variant_t和VARIANT??? 请问如何给一个 LPCWSTR 数据类型赋值? 怎样提取硬件的驱动程序 请问*.iso用什么东西打开? 关于注册表的一点问题?求助高手!!! 消息映射表编译出错 C++ MFC 串口程序,如何判断 m_strReceive是否接收完成。 想把VC第二个对话框编辑框里的内容传给第一个对话框的编辑框 关于MFC中CMenu::CreateMenu()的疑问!!!
这个问题是由于客户端closeConnection了,recvfrom就一直失败
#include <stdio.h>
#include <winsock2.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData; //WSAStartup(1,1);
wVersionRequested=MAKEWORD(1,1); int err;
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
return 0;
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return 0;
} SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(6000);
bind(sockSrv,(sockaddr*)&addSrv,sizeof(SOCKADDR)); listen(sockSrv,5);
SOCKADDR_IN addClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(sockaddr*)&addClient,&len);
char sendBuf[100];
sprintf(sendBuf,"welcome %s to whitelee's home\n",inet_ntoa(addClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
} return 0;
}
下面的是客户端的。
#include <stdio.h>
#include <winsock2.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData; int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData); if(err!=0)
return 0;
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return 0;
} SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un .S_addr =inet_addr("192.168.1.2");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(6000);
connect(sockClient,(sockaddr*)&addrClient,sizeof(SOCKADDR)); char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"this is lisi",strlen("this is lisi")+1,0); closesocket(sockClient);
WSACleanup();
return 0;
}
bind(sockSrv,(sockaddr*)&addSrv,sizeof(SOCKADDR));
和connect(sockClient,(sockaddr*)&addrClient,sizeof(SOCKADDR));
最好改成
bind(sockSrv,(SOCKADDR_IN*)&addSrv,sizeof(SOCKADDR_IN));
和connect(sockClient,(SOCKADDR_IN*)&addrClient,sizeof(SOCKADDR_IN));
还有每部的执行你都要加上判断,向bind,send,recv这些方法都可能出错的,你不加判断就很容易导致错误