学习C语言,轻松编写TCP服务器 (c tcp服务器编写)
随着互联网和计算机技术的不断发展和深入应用,TCP/IP网络协议已成为当前最为普及、最为常见的一种网络协议。对于程序员来说,了解TCP服务器的工作原理以及掌握如何编写TCP服务器将有助于提升自己的技术实力。本篇文章将带领读者了解如何在C语言的环境下轻松编写TCP服务器。
TCP/IP网络协议简介
TCP/IP是指传输控制协议/因特网协议,它是互联网协议族中最基础的协议。TCP、IP是两个互不依赖的协议,其中,TCP提供了数据的可靠传输,IP负责数据的传递。二者共同组成了TCP/IP网络协议。
TCP服务器工作原理
TCP服务器是一种基于TCP协议的网络服务,它可以通过电子设备在客户端上提供数据服务。运行TCP服务器的主机可以同时与多个客户端建立连接,客户端可以随时向TCP服务器发起请求。TCP服务器会根据客户端的请求来写入响应的数据,并返回给客户端。TCP服务器具有以下特点:
1.基于TCP协议进行响应,具有高度的可靠性;
2.支持多线程同时处理多个客户端的请求;
3.使用固定的端口并等待客户端连接,服务器端运行不间断。
C语言开发环境准备
开发TCP服务器前需要准备的工具和环境:
1.操作系统:Linux或Windows系统;
2.开发平台:DevC++6.0、Visual Studio等;
3.必备库文件:Winsock。
注:Winsock是Windows系统中提供的与网络编程相关的API接口库。
使用C语言编写TCP服务器
下面用C语言来编写一个简单的TCP服务器,并通过客户端连接测试该服务器的功能是否正常。
1.创建一个C语言工程文件
打开开发平台,然后创建一个新的C语言工程(如使用Dev-C++软件,则选择File->New->Project->Console Application),创建成功后得到两个文件:mn.c和mn.o。
2.添加Winsock库并设置相关参数
添加Winsock库文件,并在代码开头添加如下语句:
#include
#pragma comment(lib, “ws2_32.lib”)
#define PORT 8080 //指定端口号
3.初始化Winsock环境
int mn()
{
WSADATA wsa;
SOCKET s, client_sock;
struct sockaddr_in server, client;
char buf[1024] ;
int numrecv ;
printf(“\nWelcome to Socket Server\n\n”);
// 初始化Winsock
printf(“\nInitialising Winsock…”);
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf(“Fled. Error Code : %d”,WSAGetLastError());
return 1;
}
printf(“Initialised!\n”);
// 创建Socket
if((s = socket(AF_INET , SOCK_STREAM, 0 )) == INVALID_SOCKET)
{
printf(“Could not create socket : %d” , WSAGetLastError());
return 1;
}
printf(“Socket created!\n”);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
// Bind
if( bind(s,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
printf(“Bind fled with error code : %d” , WSAGetLastError());
return 1;
}
puts(“Bind done”);
// Listen to incoming connections
listen(s , 3);
//Accept and incoming connection
puts(“Wting for incoming connections…”);
while(1)
{
int c = sizeof(struct sockaddr_in);
//accept connection from an incoming clients
client_sock = accept(s , (struct sockaddr *)&client, &c);
if (client_sock == INVALID_SOCKET)
{
printf(“accept fled with error code : %d” , WSAGetLastError());
return 1;
}
printf(“Connection accepted from %s:%d\n”,
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
//Reply to the client
while(1)
{
memset(buf, 0, sizeof(buf));
numrecv = recv(client_sock, buf, sizeof(buf), 0);
if (numrecv
{
printf(“Client disconnected\n”);
break;
}
printf(“Client: %s\n”, buf);
if (send(client_sock, buf, numrecv, 0) == SOCKET_ERROR)
{
printf(“send fled with error code : %d”, WSAGetLastError());
}
}
closesocket(client_sock);
}
closesocket(s);
WSACleanup();
return 0;
}
4.运行服务端程序
将代码保存为server.c文件,并编译运行该程序(使用Dev-C++软件,F11进行编译,F9运行程序)。若一切顺利,则应该会在程序执行前打印出“Opening Sockets…”字样,表明程序已启动并处于监听状态。
5.使用客户端连接测试服务器程序
在Windows系统的命令行程序中使用telnet测试服务器程序是否可用。打开cmd窗口,输入“telnet localhost 8080”并回车,若连接成功,则会在客户端界面上看到“Welcome to Socket Server”字样,并在服务器端输出“Connection accepted from …:50866”的字样。此时,在客户端上输入任意字符串并回车,服务器端会重新输出该字符串。