服務器端
#include<Winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment (lib,"ws2_32.lib")

//服務器使用的端口號為5050
#define DEFAULT_PORT 5050
//數據緩沖區長度
#define BUFFER_LENGTH 1024

void main()
  {
//服務器端口
int iPort = DEFAULT_PORT;
WSADATA wsaData;
SOCKET sListen,sAccept;
//存放主機名稱
char hostname[256];
//客戶地址長度
int iLen;
//發送的數據長度
int iSend;
//接收的數據長度
int iRecv;
//發送給客戶的信息
char send_buf[1024];
//接收數據的緩沖區
char recv_buf[BUFFER_LENGTH];
//服務器和客戶的地址
struct sockaddr_in ser,cli;
PHOSTENT hostinfo;

printf("--------------------------\n");
printf("基于TCP的通信程序的服務器\n");
//加載 winsock庫
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
printf("Failed to load Winsock.\n");
return;
}

//獲得主機名
if(gethostname(hostname,sizeof(hostname)) != 0)
 {
printf("gethostname() Error:%u\n",WSAGetLastError());
return;
}
if((hostinfo = gethostbyname(hostname) )!= NULL)
 {
//如果獲得主機名成功的話,調用inet_ntoa()函數取得IP地址
LPCSTR ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
printf("本機的IP地址 : %s\n",ip);//輸出ip地址
printf("本機的名稱是 : %s\n",hostname);
}
printf("--------------------------\n");

//創建服務器端套接口
sListen = socket(AF_INET,SOCK_STREAM,0);
if(sListen == INVALID_SOCKET)
 {
printf("socket() Failed:%d\n",WSAGetLastError());
return;
}

//以下綁定服務器端地址
ser.sin_family = AF_INET;
//端口號:htons()函數把一個二字節字節順序的數轉換為網絡字節順序的數
ser.sin_port = htons(iPort);
//htonl()函數把一個四字節字節的數轉換為網絡系統字節順序的數
//使用系統指定的IP地址 INADDR_ANY
ser.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR)
 {
printf("bind() Failed:%d\n",WSAGetLastError());
return;
}

//進入監聽狀態
if(listen(sListen,5) == SOCKET_ERROR)
 {
printf("listen() Failed:%d\n",WSAGetLastError());
return;
}

//初始化客戶地址長度參數
iLen = sizeof(cli);

//初始化接收緩沖區
memset(recv_buf,0,sizeof(recv_buf));

//進入一個無限循環,等待客戶的連接請求
while(1)
 {
printf("等待客戶的連接請求 \n");
sAccept = accept(sListen,(struct sockaddr*)&cli,&iLen);

if(sAccept == INVALID_SOCKET)
 {
printf("accept() Failed:&d\n",WSAGetLastError());
break;
}

printf("建立TCP連接成功!\n");
printf("--------------------------\n");

//進入一個無限循環,與客戶交互
 while(1) {

//從客戶端接收數據
iRecv = recv(sAccept,recv_buf,BUFFER_LENGTH,0);

if(iRecv == SOCKET_ERROR)
 {
printf("recv() Failed.:%d\n",WSAGetLastError());
continue;
}
else if(iRecv == 0) break;
else
 {
//輸出接收到的數據
printf("客戶端說 : %s",recv_buf);
//輸出客戶IP地址和端口號
printf("(來自:%s:%d)\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
}


//給連接的客戶發送信息
printf("發送消息: ");
gets(send_buf);

iSend = send(sAccept,send_buf,sizeof(send_buf),0);

if(iSend == SOCKET_ERROR)
 {
printf("send() Failed:%d\n",WSAGetLastError());
break;
}
else if(iSend == 0) break;
else
 {
printf("發送成功.\n");
printf("--------------------------\n");
}
}
//關閉接收套接口
closesocket(sAccept);
}
//關閉監聽套接口
closesocket(sListen);
//卸載winsock庫
WSACleanup();
}

客戶端
#include<Winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment (lib,"ws2_32.lib")

//服務器使用的端口號為5050
#define DEFAULT_PORT 5050
#define DATA_BUFFER 1024

void main()
  {
WSADATA wsaData;
SOCKET sClient;
int iPort = DEFAULT_PORT;
//接收數據的緩沖
int iSend;
int iRecv;
//要發送給服務器的信息
char send_buf[1024];
//接收數據的緩沖
char recv_buf[DATA_BUFFER];
//服務器端地址
struct sockaddr_in ser;

printf("--------------------------\n");
printf("基于TCP的通信程序的客戶端\n");

//提示在命令持中輸入法服務器IP地址
printf("輸入服務器IP:");

char ipz[32];
gets(ipz);
//char * ipz=&ip;

//接收數據的緩沖區初始化
memset(recv_buf,0,sizeof(recv_buf));

if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
printf("Failed to load Winsock.\n");
return;
}

//填寫要連接的服務器地址信息
ser.sin_family = AF_INET;
ser.sin_port = htons(iPort);
//inet_addr()函數將命令持的點掃IP地址轉化為用二進制表示的網絡順序的IP地址
//ser.sin_addr.s_addr = inet_addr(argv[1]);
ser.sin_addr.s_addr = inet_addr(ipz);
//建立客戶端流式套接口
sClient = socket(AF_INET,SOCK_STREAM,0);

if(sClient == INVALID_SOCKET)
 {
printf("socket() Failed:%d\n",WSAGetLastError());
return;
}

//請求與服務器端建立TCP連接
if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser)) == INVALID_SOCKET)
 {
printf("connect() Failed.:%d\n",WSAGetLastError());
return;
}
else
 {
printf("建立TCP連接成功!\n");
printf("--------------------------\n");

//進入一個無限循環,與服務器交互
 while(1) {

//向服務器發送數據

printf("發送消息:");
gets(send_buf);

iSend = send(sClient,send_buf,sizeof(send_buf),0);

if(iSend == SOCKET_ERROR)
 {
printf("send() Failed:%d\n,WSAGetLastError()");
return;
}
else if(iSend == 0)
return;
else
printf("發送成功.\n");


//從服務器端接收數據
iRecv = recv(sClient,recv_buf,sizeof(recv_buf),0);

if(iRecv == SOCKET_ERROR)
 {
printf("recv() Failed:%d\n",WSAGetLastError());
return;
}
else if(iRecv == 0)
return;
else
 {
//顯示從服務器收到的信息
printf("服務器說:%s\n",recv_buf);
printf("--------------------------\n");
}
}
}

closesocket(sClient);
WSACleanup();
}


|