使用Dev C++進(jìn)行WinSock編程前,需要進(jìn)行一些簡單的設(shè)置,我使用的是5.11版本,在“工具->編譯器選項->編譯器”中,勾選“編譯時加入以下指令”,同時添加-lwsock32,這樣就可以了,如下圖:

圖片.png
下面是服務(wù)端的代碼:
/*
WinSock 示例 服務(wù)端
使用工具 Dev C++ 5.11
請選中“工具->編譯選項->編譯器->編譯時加入以下命令”,并加入命令-lwsock32
*/
#include<winsock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main() {
SOCKET server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
// 注冊 Winsock DLL
WSADATA wsadata;
if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
printf("Winsock 錯誤\n");
exit(1);
}
// 初始化 server socket
server_sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET(使用IPv4); SOCK_STREAM; 0(使用缺省方式TCP)
if(server_sockfd == SOCKET_ERROR) {
printf("Socket 錯誤\n");
exit(1);
}
// struct sockaddr_in {
// short int sin_family; /* AF_INT(使用IPv4) */
// unsigned short int sin_port; /* Port(端口號) */
// struct in_addr sin_addr; /* IP地址 */
// };
// sturct in_addr {
// unsigned long int s_addr;
// };
server_address.sin_family = AF_INET; // AF_INT(使用IPv4)
server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // ip地址為本機(jī)
server_address.sin_port = 8899; //必須是本機(jī)沒有使用的端口號
server_len = sizeof(server_address);
if(bind(server_sockfd, (struct sockaddr *)&server_address, server_len) < 0) {
printf("綁定錯誤\n");
exit(1);
}
if(listen(server_sockfd, 5) < 0) {
printf("偵聽錯誤\n");
exit(1);
}
while(1) {
char ch[1024]; //接收緩存
printf("服務(wù)啟動,等待中...\n");
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
if(client_sockfd == SOCKET_ERROR) {
printf("Accept Error\n");
exit(1);
}
int mess=recv(client_sockfd, ch, 1024, 0);
for(int i=0;i<mess;i++) cout<<ch[i];
cout<<endl;
string backmessage="Received" ;
send(client_sockfd, backmessage.c_str(), backmessage.length(), 0);
closesocket(client_sockfd);
}
}
這里我們在本機(jī)進(jìn)行測試,因此地址使用127.0.0.1,如果需要接收其它機(jī)器的請求,需要綁定到網(wǎng)卡的地址,可以使用ipconfig進(jìn)行查看。端口使用8899,如果端口被其它應(yīng)用占用,運行時會出錯,需要換一個沒有被占用的端口??蛻舳说拇a如下:
#include<winsock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main() {
SOCKET sockfd;
int len;
struct sockaddr_in address;
int result;
WSADATA wsadata;
if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
printf("Winsock Error\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = 8899;
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
printf("Connetc Error");
exit(1);
}
string inpu;
cin>>inpu;
send(sockfd, inpu.c_str(), inpu.length(), 0);
char ba[1024];
int reclen=recv(sockfd, ba, 1024, 0);
for(int i=0;i<reclen;i++) cout<<ba[i];
cout<<endl;
closesocket(sockfd);
exit(0);
}
服務(wù)端啟動后,進(jìn)入等待狀態(tài),啟動客戶端,輸入一個字符串,這時服務(wù)端會現(xiàn)實接收到的字符串,并給出回復(fù):

圖片.png