Socket编程---c/s模式演示demo1

本文展示了C/S模式下Socket编程的基本流程,包括服务端和客户端的代码实现。服务端通过listen监听连接,但仅accept一次,导致后续客户端连接成功但无法发送数据。为支持多个客户端同时通信,需在服务端多次调用accept。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,看服务端代码:

#include<unistd.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

/*

int socket(int domain, int type, int protocol);

//man 2 bind
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

//这个是通用协议结构,因为他们的大小都是相等的
struct sockaddr {
      sa_family_t sa_family;
      char        sa_data[14];
}

//这个是具体的tcp协议结构,和上面的大小是一样的。只不过这个是具体的tcp协议。bind的时候,看你用的是什么样的协议
man 7 ip
struct sockaddr_in {
    sa_family_t    sin_family; // address family: AF_INET *
    in_port_t      sin_port;   // port in network byte order *
    struct in_addr sin_addr;   // internet address *
};

// Internet address.结构化网络地址,可以用inet_addr("192.168.1.1")这个函数来转换成成员uint32_t
//也可以用inet_aton("192.168.1.1",inp)直接转换成结构体

struct in_addr {
    uint32_t       s_addr;    // address in network byte order *
};

int listen(int sockfd, int backlog);

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may 
grow.  If a connection request arrives when the queue is full, the client may receive an error with an 
indication of ECON‐NREFUSED or, if the underlying protocol supports retransmission, the request may be 
ignored so that a later reattempt at connection succeeds.
backlog参数定义sockfd的挂起连接队列可能增长到的最大长度。如果一个连接请求在队列满时到达,客户机可能会收到一个错误,并指示
连接拒绝,或者,如果基础协议支持重新传输,则可以忽略该请求,以便稍后重新尝试连接成功。


int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

*/

int main(){
   
	int sockfd=0;
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	
	if(sockfd==-1){
   
		perror("fun socket\n");
		exit(0);
	}
	struct sockaddr_in serveraddr;
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_port=htons(8001);
	serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值