150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子

此例子用于socket 例子,
该例子只能用于一个客户端连接server。
不能用于多个client 连接  server

socket_server_support_one_clientconnect.c


/*
此例子用于socket 例子,
该例子只能用于一个客户端连接server。
不能用于多个client 连接  server


*/
#include "wrap.h"
#define SERVER_PORT 8888

int main(int argc, const char* argv[]) {

	int lfd;
	// 第一步:创建 lfd
	lfd = Socket(AF_INET, SOCK_STREAM, 0);


	// 第二步: 给lfd 绑定 IP 和 PORT,这里需要将 port 和IP 从小端转成大端
	struct sockaddr_in sockaddrin_server;
	sockaddrin_server.sin_family = AF_INET;
	sockaddrin_server.sin_port = htons(SERVER_PORT);
	sockaddrin_server.sin_addr.s_addr = htonl(INADDR_ANY);

	Bind(lfd,(struct sockaddr *)&sockaddrin_server,sizeof(sockaddrin_server));

	//第三步:设定监听上限,这个监听上限的意思是:同时只能有8个客户端和此 server连接,我们这个server只能要一个客户端和我们连接,因此这个值在这里没有具体意义
	Listen(lfd, 8);

	// 第四步 :阻塞,并等待客户端连接. accept的第二个参数是传入传出参数,代表的是:成功于服务器连接的客户端的 地址结构
	struct sockaddr_in sockaddrin_client;
	socklen_t sockaddrin_clientsocklen_t = sizeof(sockaddrin_client);
	int  cfd = Accept(lfd, (struct sockaddr *)&sockaddrin_client, &sockaddrin_clientsocklen_t);
	char clientip[33] = { 0 };
	const char* clientipresult = inet_ntop(AF_INET, &sockaddrin_client.sin_addr.s_addr, clientip, 32);

	if (clientipresult == NULL) {
		printf("inet_ntop error\n");
	}
	else {
		printf("client addr port = %d,addr ip = %s \n", ntohs(sockaddrin_client.sin_port), clientipresult);
	}
	printf("client addr port = %d,addr ip = %s \n",ntohs(sockaddrin_client.sin_port), clientip);

	//只要客户端连接上了, 没有错误,就会走到这一步。

	//第五步:连接上后,server端就可以循环的 使用read函数 读取客户端发送过来的数据了。
	//注意的是,read函数默认是阻塞读取的
	char readbuffer[256] = { 0 };
	int readbufferlen = 0;
	
	while (1) {
		readbufferlen = Read(cfd, readbuffer, 256);
		printf("read buffer from client %s \n", readbuffer);
		for (int i = 0; i < readbufferlen; ++i) {
			readbuffer[i] = toupper(readbuffer[i]);
		}
		Write(cfd, readbuffer, readbufferlen);
		Write(STDOUT_FILENO, readbuffer, readbufferlen);
	}
}

wrap.h

#ifndef __WRAP_H_
#define __WRAP_H_

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include <netinet/ip.h> 
#include <strings.h>


void perr_exit(const char* s);
int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr);
int Bind(int fd, const struct sockaddr* sa, socklen_t salen);
int Connect(int fd, const struct sockaddr* sa, socklen_t salen);
int Listen(int fd, int backlog);
int Socket(int family, int type, int protocol);
ssize_t Read(int fd, void* ptr, size_t nbytes);
ssize_t Write(int fd, const void* ptr, size_t nbytes);
int Close(int fd);
ssize_t Readn(int fd, void* vptr, size_t n);
ssize_t Writen(int fd, const void* vptr, size_t n);
static ssize_t my_read(int fd, char* ptr);
ssize_t Readline(int fd, void* vptr, size_t maxlen);
int tcp4bind(short port, const char* IP);

#endif

wrap.c

#include "wrap.h"

void perr_exit(const char* s)
{
	perror(s);
	exit(-1);
}

int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr)
{
	int n;

again:
	if ((n = accept(fd, sa, salenptr)) < 0) {
		if ((errno == ECONNABORTED) || (errno == EINTR))
			goto again;
		else
			perr_exit("accept error");
	}
	return n;
}

int Bind(int fd, const struct sockaddr* sa, socklen_t salen)
{
	int n;

	if ((n = bind(fd, sa, salen)) < 0)
		perr_exit("bind error");

	return n;
}

int Connect(int fd, const struct sockaddr* sa, socklen_t salen)
{
	int n;

	if ((n = connect(fd, sa, salen)) < 0)
		perr_exit("connect error");

	return n;
}

int Listen(int fd, int backlog)
{
	int n;

	if ((n = listen(fd, backlog)) < 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值