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

aiyaya730 aiyaya730 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我按照某教科书上写了最基础的 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);
}


...全文
评论 4
收藏 已收藏
分享
返回顶部
aiyaya730
网络编程 18,356 成员 64,161 内容