【tcp-ip學習總結】使用tcp協議實現簡單的通訊小程式
阿新 • • 發佈:2019-01-07
環境:vs2013
server.c
#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#include<stdlib.h>
void main()
{
WSADATA wsaData;//協議棧
struct sockaddr_in server, client;//服務端和客戶端的地址
int iLen;
char recMessage[1024]; //接受字串緩衝區
SOCKET sAccept;//連線上來的那個客戶端套介面
memset(recMessage, 0, sizeof(recMessage));//將接收緩衝區內容全部變為0
printf("-------------------------\n");
printf("伺服器在等待\n");
printf("-------------------------\n");
/*
檢查協議棧是否載入成功
*/
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("協議棧載入失敗!\n");
return ;
}
//建立伺服器端套介面
SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);
if (sListen == INVALID_SOCKET)
{
printf("sListen套介面建立失敗!\n");
return;
}
//為server端地址賦值
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = htonl(INADDR_ANY);
//將服務端地址和服務端socket套介面繫結到一起
if (bind(sListen, (LPSOCKADDR)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("繫結失敗!\n");
return;
}
//開始監聽
if (listen(sListen, 5) == SOCKET_ERROR)
{
printf("監聽失敗!\n");
return;
}
//客戶端地址長度
iLen = sizeof(client);
while (1)
{
//得到連線上來的那個客戶端套介面
sAccept = accept(sListen, (struct socketaddr*)&client, &iLen);
if (sAccept == INVALID_SOCKET)
{
printf("接受失敗!");
break;
}
printf("接受的客戶端的地址IP是:[%s], port[%d]\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
//接收資料
while (1)
{
//從這個客戶端套介面上面接收資訊
int recLen = recv(sAccept, recMessage, sizeof(recMessage), 0);
if (recLen == 0)
return;
else if (recLen == SOCKET_ERROR)
{
printf("接收失敗!\n");
}
printf("沸沸騰:%s\n", recMessage);
}
}
closesocket(sAccept);//關閉套介面
closesocket(sListen);
WSACleanup();//清空協議棧
}
client.c
#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"Ws2_32.lib")
#include<stdlib.h>
void main()
{
WSADATA wsaData;//協議棧
struct sockaddr_in server;//server端的地址情況
SOCKET sClient;//客戶端套介面
//載入協議棧
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("協議棧載入失敗!\n");
return;
}
//初始化伺服器端的地址,與埠情況
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = inet_addr("172.17.152.206");
//建立一個tcp的套介面
sClient = socket(AF_INET, SOCK_STREAM, 0);
if (sClient == INVALID_SOCKET)
{
printf("套介面建立失敗!\n");
return;
}
//向伺服器端申請連線
if (connect(sClient, (struct sockaddr*)&server, sizeof(server)) == INVALID_SOCKET)
{
printf("連線失敗!\n");
return;
}
for (int i = 0; i < 5; i++)
{
printf("田騰飛: ");
char message[1024];
gets_s(message,1024);
//向客戶端套介面傳送資料
int iSend = send(sClient, message, sizeof(message), 0);
if (iSend == SOCKET_ERROR)
{
printf("傳送失敗!\n");
break;
}
else if (iSend == 0)
break;
else
{
printf("傳送成功!\n");
}
}
closesocket(sClient);//關閉套介面
WSACleanup();//清楚協議棧
}