请教一个基础的winsock编程问题

aiyaya730 2014-07-18 02:30:01
我按照某教科书上写了最基础的 tcp 连接的代码,client 端在调 connect() 函数时,总是返回 SOCKET_ERROR.
GetLastError() 有时是 10014 有时是 10056
在代码里,选择性忽略这两种错误,有的时候代码能够工作正常,有时候不行。
想请教出现这种情况的原因.
server 代码:

#include <stdio.h>
#include <WinSock2.h>

#define BUF_SIZE 1024

void ErrorHandling(char* message)
{
fputs(message,stderr);
fputs("\n",stderr);
exit(1);
}

int main(int argc,char* argv[])
{
WSADATA wsaData;
SOCKET hServerSock,hClientSock;


char message[BUF_SIZE];
int strLen;

if( argc != 2)
{
printf("Usage : %s <port>\n",argv[0]);
exit(1);
}


if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )
ErrorHandling("WSAStartup() error");

hServerSock = socket(PF_INET,SOCK_STREAM,0);
if( hServerSock == INVALID_SOCKET)
ErrorHandling("socket() error");



SOCKADDR_IN servAdr,clntAdr;
int clntAdrSize = 0;

memset(&servAdr,0,sizeof(SOCKADDR_IN));
servAdr.sin_family = AF_INET;
servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
servAdr.sin_port = htons(atoi(argv[1]));

if( bind(hServerSock,(SOCKADDR*)&servAdr,sizeof(servAdr)) == SOCKET_ERROR )
ErrorHandling("bind() error");

if( listen(hServerSock,5) == SOCKET_ERROR )
ErrorHandling("listen() error");


clntAdrSize = sizeof(clntAdr);

for( int i = 0;i < 5;i++ )
{
hClientSock = accept(hServerSock,(SOCKADDR*)&clntAdr,&clntAdrSize);
if( hClientSock == - 1 )
ErrorHandling("accept() error");
else
printf("Connected client %d \n",i + 1);

while( (strLen = recv(hClientSock,message,BUF_SIZE,0)) != 0 )
{
send( hClientSock,message,strLen,0);
}

closesocket(hClientSock);
}

closesocket(hServerSock);
WSACleanup();

return 0;
}




client 代码:

#include <stdio.h>
#include <winsock2.h>

#define BUF_SIZE 1024
void ErrorHandling(char* message);

int main(int argc,char* argv[])
{
WSADATA wsaData;
SOCKET hSocket;
char message[BUF_SIZE];
int strLen;
SOCKADDR_IN servAdr;


if( argc != 3 )
{
printf("Usage : %s <IP> <port>\n",argv[0]);
exit(1);
}

if( WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )
ErrorHandling("WSAStartup() error");

hSocket = socket(PF_INET,SOCK_STREAM,0);
if( hSocket == INVALID_SOCKET)
ErrorHandling("socket() error");

memset(&servAdr,0,sizeof(servAdr));
servAdr.sin_family = AF_INET;
servAdr.sin_addr.s_addr = inet_addr(argv[1]);
servAdr.sin_port = htons(atoi(argv[2]));
//servAdr.sin_addr.s_addr = inet_addr("127.0.0.1");
//servAdr.sin_port = htons(atoi("6666"));


connect(hSocket,(SOCKADDR*)&servAdr,sizeof(servAdr));
if( connect(hSocket,(SOCKADDR*)&servAdr,sizeof(servAdr) == SOCKET_ERROR) )
{
DWORD lasterror = GetLastError();
ErrorHandling("connect() error");
}
puts("conntected.....");

while(true)
{
fputs("Input message(Q to quit): ",stdout);
fgets(message,BUF_SIZE,stdin);

if( !strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;

send(hSocket,message,strlen(message),0);
strLen = recv(hSocket,message,BUF_SIZE - 1,0);
message[strLen] = 0;
printf("Message from server: %s",message);
}

closesocket(hSocket);
WSACleanup();

return 0;
}

void ErrorHandling(char* message)
{
fputs(message,stderr);
fputs("\n",stderr);
exit(1);
}


...全文
113 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiyaya730 2014-07-19
  • 打赏
  • 举报
回复
谢谢楼上几位帮忙. 昨天晚上敲例子时间太晚了比较困,可能有一些错误. 10054 确实是因为 connect 了两遍,有失误. 但是常常 10014的问题还没弄明白具体原因,好在现在在家重新敲的代码没有出现10014.
oyljerry 2014-07-18
  • 打赏
  • 举报
回复
client不要connect两次
zhousitiaoda 2014-07-18
  • 打赏
  • 举报
回复
为什么要connect2次。。。
mrlgy 2014-07-18
  • 打赏
  • 举报
回复
53行 send(hSocket,message,strlen(message),0); strlen改为sizeof试一试, 10056是以前的连接没有关闭吧

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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