基于tcp协议的服务器/客户端程序,基于TCP的服务器客户端编程.doc

基于TCP的服务器客户端编程

西北师范大学计算机科学与工程学院

学生实验报告

学号 日期 :

系别计算机科学与工程学院专业班级姓 名课程

名称课程

类型学时数2实验

名称实验二、基于TCP的服务器/客户端编程实验目的:1、掌握Linux下的TCP客户端基本原理和基本编程方法

实验内容:

1、写Linux下TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。

2、写Linux下TCP客户端套接字程序,结合TCP的服务器端程序,实现以下功能:

(1)、客户根据用户提供的IP地址连接到相应的服务器;

(2)、服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串;

(3)、客户接收服务器发送的信息并显示。

实验步骤:

TCP服务端程序设计

使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图所示。

??? 图1.1 TCP客户/服务器的套接字函数

socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

?#include ?int socket(int family,int type,int protocol);    ?     返回:非负描述字---成功   -1---失败

第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。

2、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。

#include       ? int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);  ?          返回:0---成功   -1---失败  第一个参数是socket函数返回的套接口描述字;第二和第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。

这些地址结构的名字均已“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。以IPv4套接口地址结构为例,它以“sockaddr_in”命名,定义在头文件;以下是结构体的内容:

struct in_addr

{?in_addr_t s_addr;     };?struct sockaddr_in {?uint8_t sin_len; ?sa_family_t sin_family;?in_port_t sin_port; ?struct in_addr sin_addr;?char sin_zero[8]; ?

};

bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。

#include  ?int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen);?返回:0---成功   -1---失败

第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。

listen函数:listen函数仅被TCP服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。

#include ?int listen(int sockfd,int backlog);   ?返回:0---成功   -1---失败

第一个参数是socket函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。由于listen函数第二个参数的原因,内核要维

可以使用Linux系统提供的socket API来实现TCP客户端连接服务器并发送“Hello Server"字符串的功能,具体代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8888 int main() { int sockfd; struct sockaddr_in server_addr; char *message = "Hello Server!"; char buffer[1024] = {0}; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(SERVER_PORT); // 连接服务器 if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("连接服务器失败"); exit(EXIT_FAILURE); } // 发送消息 if (send(sockfd, message, strlen(message), 0) < 0) { perror("发送消息失败"); exit(EXIT_FAILURE); } // 接收服务器响应 if (recv(sockfd, buffer, sizeof(buffer), 0) < 0) { perror("接收服务器响应失败"); exit(EXIT_FAILURE); } printf("收到服务器响应:%s\n", buffer); // 关闭socket close(sockfd); return 0; } ``` 这段代码首先创建了一个socket,然后设置服务器地址并连接服务器。接着发送“Hello Server"字符串到服务器,最后接收服务器的响应并输出。你可以将这段代码保存为一个C文件,然后使用gcc命令编译并运行它。当运行这个程序时,它会连接到指定的服务器并发送“Hello Server"字符串,然后接收服务器的响应并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值