使用Dev C++进行WinSock编程前,需要进行一些简单的设置,我使用的是5.11版本,在“工具->编译器选项->编译器”中,勾选“编译时加入以下指令”,同时添加-lwsock32,这样就可以了,如下图:
图片.png
下面是服务端的代码:
/*
WinSock 示例 服务端
使用工具 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地址为本机
server_address.sin_port = 8899; //必须是本机没有使用的端口号
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("服务启动,等待中...\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);
}
}
这里我们在本机进行测试,因此地址使用127.0.0.1,如果需要接收其它机器的请求,需要绑定到网卡的地址,可以使用ipconfig进行查看。端口使用8899,如果端口被其它应用占用,运行时会出错,需要换一个没有被占用的端口。客户端的代码如下:
#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);
}
服务端启动后,进入等待状态,启动客户端,输入一个字符串,这时服务端会现实接收到的字符串,并给出回复:
图片.png