Linux SOCKET编程详解(4)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 8888
#define BACKLOG 10
#define MAXDATASIZE 2048
int main(int argc, char *argv[])
{
int listenfd;
//创建一个socket描述符,此描述符仅是本主机上的一个普通文件描述符而已
listenfd = socket(AF_INET, SOCK_STREAM, 0);
printf("listenfd=%d\n", listenfd);
//定义一个结构体变量servaddr,用来记录给定的IP和port信息,为bind函数做准备
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT); //把端口转化为网络字节序,即大端模式
serveraddr.sin_addr.s_addr = INADDR_ANY;
//把“本地含义的描述符”绑定到一个IP和Port上,此时这个socket才具备对外连接的能力
bind(listen_sock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))。bind( listen_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr_in))。err = bind(listen_sd, (struct sockaddr*) &sa_serv, sizeof(sa_serv))。
//创建一个监听队列,用来保存用户的请求连接信息(ip、port、protocol)
listen(listenfd, BACKLOG);
printf( "waiting for %d thread(s) tofinish\n", pool->tp_total - pool->tp_index )。 printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr))。 printf("client:%s\n",buffer3)。
//让操作系统回填client的连接信息(ip、port、protocol)
struct sockaddr_in peeraddr;
socklen_t peer_len = sizeof(peeraddr);
int connfd;
while(1)
{
//accept函数从listen函数维护的监听队列里取一个客户连接请求处理
connfd = accept(listenfd, (struct sockaddr*)&peeraddr, &peer_len);
printf("删除成功\n\n")。 printf("硬链接:%ld\n", (long)state.st_nlink)。服务器端:epoll实现的,干两件事分别为:1.等待客户端的链接,2.接收来自客户端的数据并且回射。
printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr))。 fmt.printf("%s\n%s\n%s\n%s", host, port, container, containerport)。 printf("ip:%s msg:%s\n",inet_ntoa(clientaddress.sin_addr),buf)。
char buf[MAXDATASIZE];
while(1)
{
memset(buf, '\0', MAXDATASIZE/sizeof (char));
int recv_length = recv(connfd, buf, MAXDATASIZE/sizeof (char), 0);
if(recv_length == 0)
{
printf("client has closed!\n");
break;
}
printf("client say: ");
fputs(buf, stdout);
memset(buf, '\0', MAXDATASIZE/sizeof (char));
printf("input: ");
fgets(buf, sizeof(buf), stdin);
send(connfd, buf, recv_length, 0);
}
close(connfd);
close(listenfd);
return 0;
}}
/*************************************************************************
> File Name: cli.c
> Author: battle
> Mail: batbattle@163.com
> Created Time: 2018年06月02日 星期六 10时55分37秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#define PORT 8888
#define MAXDATASIZE 2048
int main(int argc, char *argv[])
{
if(argc != 2)
{
fprintf(stderr, "老铁,请输入想连接的服务器IP地址!\n");
exit(1);
}
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
const char *server_ip = argv[1]; //从命令行获取输入的ip地址
struct sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
if(socket_error==bind(m_socket,(structsockaddr*)&serveraddr,sizeof(serveraddr)))。getpeername(4,{sa_family=af_inet,sin_port=htons(80),sin_addr=inet_addr("10.20.187.231")},[9759721986501640208])=0。connect(4,{sa_family=af_inet,sin_port=htons(80),sin_addr=inet_addr("10.20.187.231")},16)=0。
connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
printf("删除成功\n\n")。echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n%-14s%-4s%-10s\n\n"),$1,$2,$3}' \。{ echo "此次共清除 ${pass} 个进程成功" | awk '{printf("\n\n%-14s%-4s%-10s\n\n"),$1,$2,$3}'。
char buf[MAXDATASIZE];
memset(buf, 0 , sizeof(buf));
printf("input: ");
fgets(buf, sizeof(buf), f1)。while (fgets(buf, 100, fp) 。 while( fgets( buf, 1000, f ) ) 。
{
send(sockfd, buf, sizeof(buf), 0);
memset(buf, 0, sizeof(buf));
recv(sockfd, buf, sizeof(buf), 0);
printf("server say: ");
fputs(buf, stdout);
memset(buf, 0, sizeof(buf));
printf("input: ");
}
printf("client will be closed, see you next time.\n");
close(sockfd);
return 0;
}
gcc -o cli cli.c &&gcc -o ser ser.c
两个终端上先运行服务器再运行客户端
./ser
./cli 127.0.0.1
cli:同学,走,一起去克利夫兰支持詹姆斯干掉勇士队!
ser:算了算了,我还要准备去准备网易云课堂上的【剑指BAT】安排的下一次网络编程课程呢,等我加入了一线企业,赚高薪了,哥带你飞
cli:酱紫啊,哥哥要继续加油哦,看好你,拜拜
ser:好滴,等我闭关修炼5个月,我们再见,拜拜
服务器运行结果
客户端运行结果
为了方便大家获取源代码,可以移步这里,GitHub源代码
这是阴险狡诈的计量