您现在的位置:首页 > 教案模板 > 正文

Linux SOCKET编程详解(4)

2019-07-23 07:05 网络整理 教案网

#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)

socket函数第三个参数_linux socket函数参数_socket()函数

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

socket函数第三个参数_linux socket函数参数_socket()函数

#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源代码