⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 winsock programs for TCP and UDP
💻 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 + -