一 . 只能被一个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)) <


13

被折叠的 条评论
为什么被折叠?



