套接字编程 纠错 accept函数
按照孙鑫老师的代码
在我的电脑上运行后出现错误:
TcpSrv.cpp运行到accept函数前就不在向后运行
TcpClient.cpp接受到的recvBuf是一堆乱码
这个是 TcpSrv.cpp 的代码
#include <stdio.h>
#include <Winsock2.h>
#include <String.h>
void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData;//WSADATA型对象
int err;//错误
wVersionRequsted = MAKEWORD(1,1);
err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}
//创建套接字 socket
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//绑定IP和端口 bind
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设置为监听模式
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
//不断监听 并且与客户端交换信息
while(1)
{
//与客户端建立连接 accept
printf("*****************\n");
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
printf("*****************\n");
//发送数据send
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.baidu.com",inet_ntoa(addrClient.sin_addr));
printf("%s\n",sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
//接受数据recv
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
getchar();
}
}
这个是 TcpClient.cpp 的代码
#include <stdio.h>
#include <Winsock2.h>
#include <String.h>
void main()
{
//第一步:加载套接字库 WSAStartup 最终会对应WSACleanup 释放为该应用程序分配的资源
WORD wVersionRequsted; //版本请求
WSADATA wsaData;//WSADATA型对象
int err;//错误
wVersionRequsted = MAKEWORD(1,1);
err = WSAStartup(wVersionRequsted,&wsaData);
//如果加载错误
if(err != 0)
{
return ;
}
//如果加载版本错误
if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return ;
}
//创建套接字socket
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
//连接服务器端connect
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,0);
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
//char sendBuf[100];
send(sockClient,"hello the world",sizeof("hello the world")+1,0);
//关闭套接字
closesocket(sockClient);
//释放套接字库分配的资源
WSACleanup();
}
编程 套接字???孙鑫
[解决办法]
accept后,另开线程与客户端send和recv
[解决办法]
你的代码太随意了,两个问题:
1. 服务器的 accept 是阻塞的,没有客户连接不会向下执行;
2. 客户端的recv要这样:result = recv(sockClient,recvBuf,100,0);
if (result > 0){
recvBuf[result] = 0;
printf("%s\n",recvBuf); }
建议参考《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358