概述
服务端
/*
int socket(int domain, int type, int protocol);
建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符
函数socket()的参数domain用于设置网络通信的域,
函数socket()根据这个参数选择通信协议的族。
函数socket()的参数type用于设置套接字通信的类型。
函数socket()的第3个参数protocol用于制定某个协议的特定类型,
即type类型中的某个类型。
绑定服务器的地址和端口到socket,这样做就是让客户端来发现用以连接的服务器的地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);
返回值:成功返回0,失败返回-1
参数sockfd: 服务器socket
参数addr: 服务器的地址,对于因特网域,如果设置地址为INADDR_ANY,
套接字可以绑定到所有的网络端口。这意味着可以收到这个系统所有网卡的数据包。
一般我们在使用sockaddr_in类型的结构体代替sockaddr结构体
服务器调用listen函数来宣告可以接受连接请求
int listen(int sockfd, int backlog);
参数backlog:用于表示服务器能接受的请求数量
一旦服务器调用了listen,套接字就能接收连接请求。使用函数accept函数来接受并建立请求
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);
参数sockfd: 服务器socket
参数addr: 用来存放客户端的地址,如果addr的空间足够大,系统会自动填充。
参数len: addr的长度
如果不关心客户端ip,那么addr和len可以设为NULL
收发数据,用函数recv()、send()/sendto()或者read()、write()
关闭网络连接,close()
*/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int startup(int _port,const char* _ip)
{
int sock=socket(AF_INET,SOCK_STREAM,0);//打开一个网络通信窗口
if(sock<0)
{
perror("socket");
exit(1);
}
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(_port);
local.sin_addr.s_addr=inet_addr(_ip);
socklen_t len=sizeof(local);
if(bind(sock,(struct sockaddr*)&local,len)<0)//绑定一个固定的网络地址和端口号
{
perror("bind");
exit(2);
}
if(listen(sock,5)<0)//导致套接口从closed状态换到listen状态
{
perror("listen");
exit(3);
}
return sock;
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
printf("Usage: [local_ip] [local_port]",argv[0]);
return 3;
}
int listen_socket=startup(atoi(argv[2]),argv[1]);
struct sockaddr_in remote;
socklen_t len=sizeof(struct sockaddr_in);
while(1)
{
int socket=accept(listen_socket,(struct sockaddr*)&remote,&len);
if(socket<0)
{
perror("accept");
continue;
}
printf("client,ip:%s,port:%dn",inet_ntoa(remote.sin_addr)
,ntohs(remote.sin_port));
char buf[1024];
while(1)
{
ssize_t _s=read(socket,buf,sizeof(buf)-1);
if(_s>0)
{
buf[_s]=0;
printf("client# %sn",buf);
}
else
{
printf("client is quit!n");
break;
}
}
close(socket);
}
return 0;
}
客服端
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
static void usage(const char* proc)
{
printf("usage:%s [ip] [port]n",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
usage(argv[0]);
return 3;
}
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
exit(1);
}
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sock,(struct sockaddr*)&server,(socklen_t)sizeof(server))<0)
//三次握手建立链接
{
perror("connect");
exit(2);
}
char buf[1024];
while(1)
{
printf("send#");
fflush(stdout);
ssize_t _s=read(0,buf,sizeof(buf)-1);//数据请求
buf[_s-1]=0;
write(sock,buf,_s);
}
close(sock);//四次握手
return 0;
}
gcc client.c -o client -lpthread
gcc server.c -o server -lpthread
./server 127.16.10.207 8080
./client 172.16.10.207 8080
最后
以上就是可爱小松鼠为你收集整理的Linux多线程三 简单的TCP服务端和客户端传输的全部内容,希望文章能够帮你解决Linux多线程三 简单的TCP服务端和客户端传输所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复