请教一个基础的winsock编程问题
我按照某教科书上写了最基础的 tcp 连接的代码,client 端在调 connect() 函数时,总是返回 SOCKET_ERROR.
GetLastError() 有时是 10014 有时是 10056
在代码里,选择性忽略这两种错误,有的时候代码能够工作正常,有时候不行。
想请教出现这种情况的原因.
server 代码:
client 代码:
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);
}
...全文
相关推荐
WINSOCK编程基础.ppt
【WINSOCK编程基础】WINSOCK编程是网络通信领域中的一个重要组成部分,它为开发者提供了在Windows操作系统上实现网络应用程序的接口。
winsock例程 一个winsock的简单例程,适合新手
**Winsock基础** - **定义**: Winsock是Windows操作系统中的网络编程接口,遵循Berkeley Sockets API,允许开发者创建TCP/IP协议的应用程序。
winsock编程实例
- **`CAsyncSocket` 类**:这是一个较为底层的类,它封装了大部分的Winsock API函数,适用于有一定网络编程基础的开发者。
winsock win10 注册表备份文件
**Winsock (Windows Socket)** - Winsock是Windows上的一个API(应用程序编程接口),用于开发网络应用。
WinSock编程基础讲义
**WinSock编程基础**WinSock,也称为Windows Socket API,是微软为Windows操作系统提供的网络通信接口,它使得程序员能够利用TCP/IP协议栈进行网络编程。


网络编程
