关于网友提出的“ 我初学winsock编程,有个小问题清高手指教(100分)!!”问题疑问,本网通过在网上对“ 我初学winsock编程,有个小问题清高手指教(100分)!!”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 我初学winsock编程,有个小问题清高手指教(100分)!!
描述: 我想做一个很简单的客户端和服务器端通讯的程序,程序很简单就是客户端向服务器发送一条信息,
然后服务器端显示它,就可以了。(服务端和客户端都在一个机器上运行)
我的代码如下:(代码很简单)
server 端
int main(int argc,char *argv[])
{
bool flag=true;
int iRes,iPort,iTmp;
SOCKET s,rs;
SOCKADDR_IN sin,rsin;
WSADATA wsad;
WORD wVersionReq;
char recvBuf[BUFLEN];
if(argc<2)
{
printf(" Please Input the Port !" );
return -1;
}
iPort=0;
iPort=atoi(argv[1]);
if(iPort<=0)
{
printf("must specify a port number");
return -1;
}
wVersi />
iRes=WSAStartup(wVersionReq,&wsad);
//
s=socket(PF_INET,SOCK_STREAM,0);
//
sin.sin_family=PF_INET;
sin.sin_port=htons(iPort);
sin.sin_addr.s_addr=INADDR_ANY;//local address
iTmp=sizeof(sin);
if(bind(s,(LPSOCKADDR)&sin,iTmp)==SOCKET_ERROR)
{
SocketError("bind()");
closesocket(s);
WSACleanup();
return -1;
}
if(listen(s,1)==SOCKET_ERROR)
{
SocketError("listen()");
closesocket(s);
WSACleanup();
return -1;
}
//
printf("Web Server Running......\n");
iTmp=sizeof(rsin);
rs=0;
rs=accept(s,(LPSOCKADDR)&rsin,&iTmp);
if(rs==INVALID_SOCKET)
{
SocketError("accept()");
closesocket(s);
WSACleanup();
return -1;
}
//????????
iRes=recv(rs,recvBuf,BUFLEN,0);//?????程序停住
if(iRes==SOCKET_ERROR)
{
SocketError("recv()");
closesocket(rs);
closesocket(s);
WSACleanup();
return -1;
}
printf("RECEIVED DATA: \n---------------------------------\n%s\n---------------------------------\n",recvBuf);
printf("WebServer Stopped......\n");
closesocket(rs);
closesocket(s);
WSACleanup();
return 0;
}
输入为:
c:\>server 1024 (1024)为我选择的端口号
但是程序好像是在这行iRes=recv(rs,recvBuf,BUFLEN,0);就停住,等很长时间也没响应
client 端代码:(运行正常)
int main(int argc,char*argv[])
{ int iRes,iPort,iTmp;
SOCKET s,rs;
SOCKADDR_IN sin,rsin;
WSADATA wsad;
WORD wVersionReq;
char recvBuf[BUFFLEN];
iPort=0;
iPort=atoi(argv[2]);
sin.sin_addr.s_addr=inet_addr(argv[1]);
sin.sin_family=PF_INET;
sin.sin_port=htons(iPort);
if(iPort<=0)
{
printf("must specify a number for port\n");
return -1;
}
wVersi />
iRes=WSAStartup(wVersionReq,&wsad);
if(iRes!=0)
{
SocketError("WSAStartup()");
return -1;
}//
s=socket(PF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
SocketError("socket()");
return -1;
}
iTmp=sizeof(sin);
printf("WinSock Client Start......\n");
if(connect(s,(LPSOCKADDR)&sin,iTmp)==SOCKET_ERROR)
{
SocketError("connect()");
closesocket(s);
WSACleanup();
return -1;
}
strcpy(recvBuf,argv[3]);
strcat(recvBuf,"\r\n\r\n");
//
iRes=send(s,recvBuf,strlen(recvBuf),0);
if(iRes==SOCKET_ERROR)
{
SocketError("send()");
closesocket(s);
WSACleanup();
return -1;
}
printf("Sent Data:\n------------------\n%s\n------------------\n",recvBuf);
closesocket(s);
WSACleanup();
return 0;
}
我的输入为c:\>client 172.16.42.4 1024 helloworld(第一个参数为我本机的IP地址,第三个参数是要发送的内容)
程序运行后能正常的把发给server的内容显示出来,我觉得应该是已经连接到server端了
但是server端没有任何显示,也不能退出。
请高手指点!!
解决方案1: 程序我试过了,是对的。
(IP换成了我在局域网的IP)
如果换成127.0.0.1也是对的。
解决方案2: http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=901&page=2
SOCKET API通讯程序
解决方案3: sin.sin_addr.s_addr=INADDR_ANY;//local address
最好改为
sin.sin_addr.s_addr=htonl(INADDR_ANY);//local address
是的 因为 主机的数据存储格式最好转为网络格式..
还有 可以专门用一个线程去处理这个连接 (如果你的连接不会很多的话)..
解决方案4: 楼上2个说得都是很有道理得。
解决方案5: 你程序存在的问题
server 1024 (1024)
端口最好不要用1-1024。
iRes=recv(rs,recvBuf,BUFLEN,0);//?????程序停住
正常,因为此为阻塞socket,只到有数据时才会向下执行
sin.sin_addr.s_addr=INADDR_ANY;//local address
最好改为
sin.sin_addr.s_addr=htonl(INADDR_ANY);//local address
以上介绍了“ 我初学winsock编程,有个小问题清高手指教(100分)!!”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3139346.html