?? 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 + -