套接字编程 纠错 accept函数

jiuweishensuan 2012-12-30 10:21:11
按照孙鑫老师的代码
在我的电脑上运行后出现错误:

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_IN addrSrv;
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();
}

...全文
269 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
laqhelen 2013-01-11
  • 打赏
  • 举报
回复
你的代码太随意了,两个问题: 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
jiuweishensuan 2012-12-31
  • 打赏
  • 举报
回复
能说具体一点吗 可以把代码写一下吗
ouyh12345 2012-12-31
  • 打赏
  • 举报
回复
accept后,另开线程与客户端send和recv

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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