C实现简单TCP通信
C实现简单TCP通信
1.添加所需的window库
在VC6++下编程
代码用到了其他的lib库,需要添加
工程--->设置--->Link--->library
modules添加ws2_32.lib(与其他lib用空格隔开)
2.服务器端代码
#include"winsock2.h"
#include "stdio.h"
#define SERVER_PORP 8884//服务器端口号
void main()
{
//加载套接字(winsock)库,
//加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
//版本号为1.1
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
//创建套接字
SOCKET sockServer=socket(AF_INET,SOCK_STREAM,0);
//AF_INET指协议簇
//SOCK_STREAM参数设置为TCP连接
SOCKADDR_IN addrServer;
//设置服务器端套接字的相关属性
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//设置IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(SERVER_PORP);
//设置端口号
//将套接字绑定到本地地址和指定端口上
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//将套接字设置为监听模式,并将最大请求连接数设置成5,超过此数的请求全部作废
listen(sockServer,5);
SOCKADDR_IN addrClient; //用来接收客户端的设置,包括IP和端口
int len=sizeof(SOCKADDR);
while(1) //不断监听
{
//得到创建连接后的一个新的套接字,用来和客户端进行沟通,原套接字继续监听客户的连接请求
SOCKET sockConn=accept(sockServer,(SOCKADDR*)&addrClient,&len);
if(sockConn!=INVALID_SOCKET) //创建成功
{
char sendInfo[100];
//inet_ntoa将结构转换为十进制的IP地址字符串
sprintf(sendInfo,"welcome %s to this Server!",inet_ntoa(addrClient.sin_addr));
//成功建立连接后向客户端发送数据,结果将显示在客户端上
send(sockConn,sendInfo,strlen(sendInfo)+1,0);
//从客户端接收数据,结果显示在服务器上
char recvInfo[100];
recv(sockConn,recvInfo,100,0);
printf("%s\n",recvInfo);
while(1)
{
if(recv(sockConn,recvInfo,100,0)<0)
break; //客户端断开recv返回负值
printf("%s\n",recvInfo);
sprintf(sendInfo,recvInfo);
send(sockConn,sendInfo,strlen(sendInfo)+1,0);
sprintf(sendInfo,"\nsever receive this text!\n");
send(sockConn,sendInfo,strlen(sendInfo)+1,0);
}
//将本次建立连接中得到套接字关闭
closesocket(sockConn);
}
else
{
int errCode=WSAGetLastError();
printf("the errcode is:%d\n",errCode);
}
}
//如果本程序不是死循环,那么在此处还应添加以下代码:
closesocket(sockServer); //对一直处于监听状态的套接字进行关闭
WSACleanup(); //终止对winsocket库的使用
}
3.客户端代码
#include "winsock2.h"
#include "stdio.h"
#define SERVER_IP "127.0.0.1" //服务器IP地址
#define SERVER_PORP 8884 //服务器端口号
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); //版本好为1.1
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //SOCK_STREAM参数设置为TCP连接
SOCKADDR_IN addrServer; //服务器地址结构
addrServer.sin_addr.S_un.S_addr=inet_addr(SERVER_IP); //服务器地址
addrServer.sin_port=htons(SERVER_PORP); //服务器端口号
addrServer.sin_family=AF_INET;
//与服务器端建立连接,进行通信
int connReult=connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
if(connReult!=WSAEADDRNOTAVAIL) //访问成功
{
//成功建立连接后向服务器端发送数据,结果将显示在服务器端上
char sendInfo[100];
send(sockClient,"this is zhangsan!",strlen("this is zhangsan!")+1,0);
//接收来自服务器端发送来的信息
char recvInfo[100];
recv(sockClient,recvInfo,100,0);
printf("%s\n",recvInfo);
while(1)
{
scanf("%s",sendInfo);
send(sockClient,sendInfo,strlen(sendInfo)+1,0);
recv(sockClient,recvInfo,100,0);
printf("%s",recvInfo);
recv(sockClient,recvInfo,100,0);
printf("%s",recvInfo);
}
}
else
{
int errCode=WSAGetLastError();
printf("the errcode is:%d\n",errCode);
}
closesocket(sockClient);
WSACleanup();
}
客户端和服务器应分别属于两个exe
先运行服务器,后运行客户端