TCP服务器端程序(C语言)

TCP服务器端程序,与TCP客户端配合使用

Visual Stdio运行

// TCP客户端.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32")
using namespace std;
int main()
{
	//WSA是web server API的简写

	WSADATA wsaData;
		//给WSAStartup初始化用的数据结构

	printf("init socket ...\n");


	WSAStartup(MAKEWORD(2,2), &wsaData);
	    //MAKEWORD是合成一个字,用来表示版本信息的
		//指向一个WSADATA的指针。

	printf("init successfully\n");
	printf("create TCP socket...\n");

	SOCKET sLisent = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	//socket函数调用成功会返回一个套接字描述符,失败则返回INVALID_SOCKET
		//调用socket时应该使用PF_INET (协议族)
		//指定新套接字描述符的类型  SOCK_STREAM是流套接字
		//指定应用程序所使用的通信协议
	
	printf("socket create successfully\n");
	
	
	struct sockaddr_in ServerAddr;
	   //sockaddr结构体是为了保持各个特定协议之间的兼容性而设计的
	   //是一个用来存储地址信息的结构体
	   //为bind()函数指定地址和端口时,向sockaddr_in结构体填充相应的内容
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
		//inet_addr转换函数把点分十进制表示的IP地址转换为in_addr结构体可以接受的类型
	ServerAddr.sin_port = htons(1234);
		//htons() 转换字节序
	
	bind(sLisent, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
    //绑定套接字与地址信息
	    //新建的套接字描述符
		//一个sockaddr的结构体
		//sockaddr结构体的大小

	printf("bind successfully\n");

	listen(sLisent, SOMAXCONN);
	//端口监听
		//要监听的套接字描述符
		//允许进入请求连接队列的个数,其最大值由系统指定,在winsock2.h中,其最大值由SOMAXCONN表示
	sockaddr_in ClientAddr;
	int nSize = sizeof(ClientAddr);
	
	printf("wait for a connection on port %d\n", 1234);


	SOCKET sClient;
	sClient = accept(sLisent, (SOCKADDR *)&ClientAddr, &nSize);
	//获取连接请求----该函数从请求队列中获取连接信息,创建新的套接字描述符,获取客户端地址。新创建的套接字用于和客户端通信
		//处于监听的套接字描述符
		//指向一个sockaddr结构体的指针,用来返回客户端的地址信息
		//指向int型的指针变量,用来传入sockaddr结构体的指针大小
    //sClient获得接受的套接字描述符
	printf("ClientIP=%s:%d\r\n", inet_ntoa(ClientAddr.sin_addr),
		ntohs(ClientAddr.sin_port));


	char szMsg[MAXBYTE] = { 0 };
	lstrcpy(szMsg, "hello Client!\r\n");
	send(sClient, szMsg, strlen(szMsg) + sizeof(char), 0);
	//发送消息
		//accept()函数返回的套接字描述符
		//发送消息的缓冲区
		//缓冲区的长度
		//通常赋0
	 
	recv(sClient, szMsg, MAXBYTE, 0);
	//接受消息
		//使用方法与send相同
	printf("Client Msg : %s \r\n", szMsg);



	WSACleanup();
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的TCP服务器端TCP客户端的示例代码,使用C语言编写: TCP服务器端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置socket选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定socket到指定的IP和端口号 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听socket if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 从客户端接收数据 valread = read(new_socket, buffer, 1024); printf("%s\n", buffer); // 向客户端发送数据 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); return 0; } ``` TCP客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 int main(int argc, char const *argv[]) { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; // 创建socket文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将IP地址从文本转换为网络字节序 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 向服务器发送数据 send(sock, hello, strlen(hello), 0); printf("Hello message sent\n"); // 从服务器接收数据 valread = read(sock, buffer, 1024); printf("%s\n", buffer); return 0; } ``` 以上代码是一个简单的TCP服务器端TCP客户端的示例代码,实现了客户端向服务器发送数据,服务器接收数据后向客户端发送响应的功能。你可以将代码保存为server.c和client.c, 然后分别使用以下命令编译和运行: ```bash gcc server.c -o server ./server gcc client.c -o client ./client ``` 当然,在运行服务器端之前,你需要确保端口号8080没有被其他进程占用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值