以下代碼是TCP協(xié)議在winsocket下的實現(xiàn),在vs2013下運行有效剥槐。
服務(wù)器部分代碼:
#include <stdio.h>
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
/*------------定義變量------------*/
char sendBuff[100], recvBuff[100]; //定義發(fā)送和接受字符串?dāng)?shù)組
int sendLen, recvLen; //定義發(fā)送和接受字符長度
SOCKET socketSend; //定義套接字
SOCKADDR_IN srvAddr; //服務(wù)器地址信息結(jié)構(gòu)體
WORD wVersionRequest; //unsigned short
WSADATA wsaData; //winsocket 版本信息
int error; //定義錯誤
/*---------初始化套接字庫---------*/
//定義版本類型林说,將兩個字節(jié)組合成一個網(wǎng)絡(luò)字節(jié)序蓖扑,前面是低字節(jié),后面是高字節(jié)(網(wǎng)絡(luò)字節(jié)序采用高字節(jié)序筷屡,CPU采用低字節(jié)序)
wVersionRequest = MAKEWORD(2, 2);
if (WSAStartup(wVersionRequest, &wsaData) != 0)
{
printf("套接字版本庫初始化失敗簸喂!\n");
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("版本不符毙死!\n");
WSACleanup();
return 0;
}
/*---------設(shè)置服務(wù)器地址---------*/
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
srvAddr.sin_port = htons(8888);
/*-----------創(chuàng)建套接字-----------*/
socketSend = socket(AF_INET, SOCK_STREAM, 0);
/*-----向服務(wù)器發(fā)出connect連接----*/
if (connect(socketSend, (SOCKADDR *)&srvAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
printf("連接失敗娘赴!\n");
}
while (1)
{
/*------發(fā)送數(shù)據(jù)-------*/
printf("Please Enter Message:\n");
//scanf_s("%s", sendBuff, 100);
gets_s(sendBuff, 100);
if (send(socketSend, sendBuff, 100, 0) < 0)
{
printf("發(fā)送失敼嬲堋!\n");
}
/*------接收數(shù)據(jù)-------*/
if (recv(socketSend, recvBuff, 100, 0) < 0)
{
printf("接收失敺瘫怼唉锌!\n程序退出\n");
break;
}
else
{
printf("Server says:%s\n", recvBuff);
}
}
closesocket(socketSend);
WSACleanup();
return 0;
}
客戶端部分代碼:
#include <stdio.h>
#include <winSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
/*------------定義變量------------*/
char sendBuff[100], recvBuff[100]; //定義發(fā)送和接受字符串?dāng)?shù)組
int sendLen, recvLen; //定義發(fā)送和接受字符長度
SOCKET socketSend; //定義套接字
SOCKADDR_IN srvAddr; //服務(wù)器地址信息結(jié)構(gòu)體
WORD wVersionRequest; //unsigned short
WSADATA wsaData; //winsocket 版本信息
int error; //定義錯誤
/*---------初始化套接字庫---------*/
//定義版本類型,將兩個字節(jié)組合成一個網(wǎng)絡(luò)字節(jié)序竿奏,前面是低字節(jié)袄简,后面是高字節(jié)(網(wǎng)絡(luò)字節(jié)序采用高字節(jié)序,CPU采用低字節(jié)序)
wVersionRequest = MAKEWORD(2, 2);
if (WSAStartup(wVersionRequest, &wsaData) != 0)
{
printf("套接字版本庫初始化失敺盒ァ绿语!\n");
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("版本不符!\n");
WSACleanup();
return 0;
}
/*---------設(shè)置服務(wù)器地址---------*/
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
srvAddr.sin_port = htons(8888);
/*-----------創(chuàng)建套接字-----------*/
socketSend = socket(AF_INET, SOCK_STREAM, 0);
/*-----向服務(wù)器發(fā)出connect連接----*/
if (connect(socketSend, (SOCKADDR *)&srvAddr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
printf("連接失敗吕粹!\n");
}
while (1)
{
/*------發(fā)送數(shù)據(jù)-------*/
printf("Please Enter Message:\n");
//scanf_s("%s", sendBuff, 100);
gets_s(sendBuff, 100);
if (send(socketSend, sendBuff, 100, 0) < 0)
{
printf("發(fā)送失斨指獭!\n");
}
/*------接收數(shù)據(jù)-------*/
if (recv(socketSend, recvBuff, 100, 0) < 0)
{
printf("接收失斊ジ聚请!\n程序退出\n");
break;
}
else
{
printf("Server says:%s\n", recvBuff);
}
}
closesocket(socketSend);
WSACleanup();
return 0;
}