📄 server.c
字号:
//File Name: server.c
//服务器程序接收到连接,它显示接收到的报文所包含的字符串
//并且把报文的内容拷贝到新的字符串,再发送出去,这时相当于交换了IP地址和UDP端口号
//命令行格式:server 端口号
#include "winsock.h"
#include "stdio.h"
#define TRUE 1
#pragma comment(lib,"wsock32")
main( int argc, char *argv[] )
{
WSADATA WSAData;
int sock;
int msgsock;
struct sockaddr_in cliaddr;
struct sockaddr_in srvaddr;
int addrlen;
char send_message[100];
char recv_message[100];
//命令行参数不能少于2个(server 端口号)
if (argc < 2)
{
printf("usage: server server_port\n");
exit(0);
}
//初始化Ws2_32.dl
WSAStartup(MAKEWORD(1,1),&WSAData);
//创建套接字
sock = socket( AF_INET, SOCK_STREAM, 0 );
if ( sock < 0 ) {
perror( "opening stream socket" );
exit( 1 );
}
//创建地址,端口号
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = INADDR_ANY;
srvaddr.sin_port = atoi(argv[1]);
//把本地地址绑定到创建的套接字上
if ( bind(sock, (struct sockaddr *)&srvaddr, sizeof(srvaddr)) < 0 ) {
perror( "binding stream socket" );
exit( 2 );
}
//开始监听端口
if ( listen( sock, 5 ) < 0 )
{
perror( "listening stream socket" );
exit( 3 );
}
while( 1 ) {
//等待接收连接
addrlen = sizeof(cliaddr);
msgsock = accept( sock, (struct sockaddr *)&cliaddr, (int *)&addrlen );
if ( msgsock == -1 )
{
perror( "accept" );
exit( 4 );
}
//从客户机接收消息
if ( recv(msgsock, recv_message, 100, 0) < 0 )
{
perror( "reading stream message" );
exit( 5 );
}
//把收到的报文消息打印出来
printf("receive: %s\n", recv_message);
//把收到的报文消息拷贝下来
strcpy( send_message, "message (" );
strcat( send_message, recv_message );
strcat( send_message, ") has received!" );
//发送消息到客户机
if ( send(msgsock, send_message, 100, 0) < 0)
{
perror("send");
exit( 6 );
}
//关闭消息套接字
closesocket( msgsock );
}
//关闭套接字
closesocket( sock );
WSACleanup();
exit( 0 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -