客户端代码
/*
* this is client
* write by newsyoung at 2013/9/7
*/
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32")
#define SERVER_IP "172.31.26.42"
#define SERVER_PORT 6100
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
//加载套接字WSAStartup()
WORD wVertionRequested;
WSADATA wsaData;
int res;
wVertionRequested = MAKEWORD(2,2); //设置socket 版本为2.2版
res = WSAStartup(wVertionRequested,&wsaData);
if(res!=0)
{
printf("load socket library failed!\n");
return 0;
}else{
printf("load socket library successed\n");
}
//如果不是使用V2.2版本将终止使用
if( LOBYTE (wsaData.wVersion) !=2 || HIBYTE (wsaData.wVersion) != 2)
{
WSACleanup();
return 0;
}else{
printf("Windows socket library is ws2_32\n");
}
//创建客户端套接字
SOCKET clientSocket;
//初始化套接字
//socket(int af,int type,int protocol)
//af指的是通信发送的区域,type指的连接的类型,比如是面向连接的和无连接的,protocol指定连接的协议
clientSocket = socket(AF_INET,SOCK_STREAM,6); //在网际网中使用TCP连接方式
if(clientSocket == INVALID_SOCKET)
{
printf("create socket failed \n");
return 0;
}else{
printf("create socket is successed\n");
}
//与服务端建立连接
int connectResult; //连接成功还是失败
//设置客户端连接服务器端的IP地址,和端口 通过SOCKADDR_IN机构体来完成
SOCKADDR_IN addrSever;
addrSever.sin_family = AF_INET; //必须使用网际网的地址族
addrSever.sin_port = htons(SERVER_PORT);
addrSever.sin_addr.S_un.S_addr = inet_addr(SERVER_IP); //设置IP地址 采用点分十进制的方式
//connect()的三个参数,分别表示:客户端的socket,服务器的地址,地址长度
connectResult = connect(clientSocket,(SOCKADDR *)&addrSever,sizeof(SOCKADDR));
if(connectResult != 0)
{
printf("connectResult is %d\n",connectResult);
printf("connect server:%s is failed\n",SERVER_IP);
system("pause");
return 0;
}else{
printf("connect %s is successed\n",SERVER_IP);
}
//向服务器端发送消息,通过send()
int sendResult; //send()函数的返回值
// char sendBuf[BUFFER_SIZE];
// memset(sendBuf,0,BUFFER_SIZE); //对sendBuf用0进行初始化
// strcpy((char *)sendBuf,"I am client");
sendResult = send(clientSocket,/*(char *)sendBuf*/"I am client",BUFFER_SIZE,0);
if(sendResult == SOCKET_ERROR)
{
printf("send message is failed\n");
return 0;
}
// }else{
// printf("send:%s\n",sendBuf);
// }
//接收服务发来的消息,通过recv()
int recvResult = 0; //recv()返回的结果
char recvBuf[BUFFER_SIZE];
memset(recvBuf,0,BUFFER_SIZE);
recvResult = recv(clientSocket,(char *)recvBuf,BUFFER_SIZE,0);
if(recvResult == SOCKET_ERROR)
{
printf("receive message is failed\n");
}else{
printf("receive message from server is :%s",recvBuf); //打印接收到字符串
printf("\n");
system("pause");
}
//关闭连接
closesocket(clientSocket);
WSACleanup();
return 0;
}
服务端代码:
/*
* this is server
* write by newsyoung at 2013/9/7
*/
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32")
#define SERVER_PORT 6100
#define BUFFER_SZIE 1024
int main(int argc,char *argv[])
{
//加载socket库
WORD wVersionRequested;
WSADATA wsaData;
int res;
wVersionRequested = MAKEWORD(2,2); //设置Ws2_32库的版本为2.2
res = WSAStartup(wVersionRequested,&wsaData); //加载Ws2_32socket库
if(res != 0)
{
printf("load socket library is failed\n");
return 0;
}
//判断加载的socket库是否为2.2版本,如果不是将不可用
if (LOBYTE (wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return 0;
}
//创建服务器端套接字
SOCKET socketServer;
//初始化套接字
socketServer = socket(AF_INET,SOCK_STREAM,6);
if(socketServer == INVALID_SOCKET)
{
printf("create server socket is failed\n");
return 0;
}
//连接向服务器发出连接请求的客户端
int bindResult; //接收bind()的连接结果
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(SERVER_PORT);
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //响应任何IP的连接请求
bindResult = bind(socketServer,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
if(bindResult == SOCKET_ERROR)
{
printf("bind is failed \n");
system("PAUSE");
return 0;
}
//监听客户端
int listenResult = 0; //监听结果
listenResult = listen(socketServer,5); //最多响应5个连接请求
if(listenResult == SOCKET_ERROR )
{
printf("server listen is failed\n");
return 0;
}
//接收客户端发来的消息
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
SOCKET sockConnection;
sockConnection = accept(socketServer,(SOCKADDR *)&addrClient,&len);
if(sockConnection == INVALID_SOCKET)
{
printf("server accept is failed\n");
}
int recvResult = 0; //接收消息结果
char recvBuf[BUFFER_SZIE];
memset(recvBuf,0,BUFFER_SZIE);
recvResult = recv(sockConnection,(char *)recvBuf,BUFFER_SZIE,0);
if(recvResult == SOCKET_ERROR)
{
printf("receive client message is failed\n");
return 0;
}else{
//打印接收到的客户信息
in_addr clientIP; //保存连接的客户端IP
memcpy(&clientIP,&(addrClient.sin_addr.S_un.S_addr),sizeof(addrClient.sin_addr.S_un.S_addr));
printf("client ip is :%s\n",inet_ntoa(clientIP)); //inet_ntoa将ip地址转换为字符串
printf("receive message from client is :%s",recvBuf);
}
//发送消息给客户端
int sendResult = 0; //发送结果
sendResult = send(sockConnection,"I am server",BUFFER_SZIE,0);
if(sendResult == SOCKET_ERROR)
{
printf("server send message is failed\n");
return 0;
}
closesocket(sockConnection); //关闭连接
}
closesocket(socketServer);
WSACleanup();
return 0;
}