基本tcp socket编程
程序员文章站
2022-07-11 08:27:51
...
在linux系统中tcp套接字编程,本例是客户端向服务器发送一条消息,服务器将消息接受后又发送给客户端,是在ubuntu虚拟机上运行的。不说废话了直接上代码。首先是服务器,服务器要先socket(),再初始化结构体,再bind(),再listen()监听客户端的连接,循环accept()接受客户端的连接,处理数据。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>//sockaddr_in
#include <stdlib.h>
#include <string.h>//strlen
#include <unistd.h>//read ,write
#include <errno.h>
#include <sys/types.h>
int main(int argc,char ** argv){
int sockfd,connfd,n;//本地套接字连接符号,客户端连接符号,接收数据的长度
socklen_t len;
struct sockaddr_in servaddr,cliaddr;//服务器、客户端结构地址
char buff[100];//接收数据的数组
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){//创建套接字
printf("socket error");
exit(0);
}
bzero(&servaddr,sizeof(servaddr));//初始化套接字
servaddr.sin_family = AF_INET;//ipv4版本
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//本机地址
servaddr.sin_port = htons(4399);//端口号
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));//绑定端口
listen(sockfd,5);//监听端口,第二个参数写5就好
while(1){
len = sizeof(cliaddr);
if((connfd = accept(sockfd,(struct sockaddr *)NULL,NULL))<0){//接受客户端的连接
printf("error");
continue;
}
if(!fork()){//这一段是并发服务器的写法,如果使用迭代的话把fork()函数去掉
n = recv(connfd,buff,100,0);//从客户端接受数据
send(connfd,buff,n,0);//向客户端发送数据
close(connfd);//子进程关闭套接字
}
buff[n] = '\0';
printf("recv from cli %s",buff);
close(connfd);//父进程关闭套接字开始下一轮的处理
}
return 0;
然后是客户端,socket(),再初始化结构体,再connet(),再获取键盘读入的数据, send()/write()发送数据,recv()/read()接收数据,下面是代码。
#include <stdio.h>
#include <stdlib.h>// 基本头文件
#include <sys/socket.h>//socket()
#include <netinet/in.h>//struct sockaddr_in
#include <unistd.h>
#include <string.h>//strlen()函数
#include <arpa/inet.h>//inet_pton()函数
#include <errno.h>
int main(int argc,char ** argv){
int sockfd,conn,n;
char buff[100],sd[100];//接受和发送数据的数组
struct sockaddr_in cliaddr;//服务器结构地址
if(argc!=2){
printf("ip address");
exit(0);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//创建套接字
printf("socket error");
exit(0);
}
bzero(&cliaddr,sizeof(cliaddr));//初始化结构地址
cliaddr.sin_family = AF_INET;//ipv4版本
cliaddr.sin_port = htons(4399);//端口号
if(inet_pton(AF_INET,argv[1],&cliaddr.sin_addr)<0){//将从键盘传入的IP参数赋值给&server.sin_addr.s_addr
printf("error");
exit(0);
}
if((conn=connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr)))<0){//连接服务器
printf("cerror");
exit(0);
}
fgets(sd,100,stdin);//从键盘读入数据
if(send(sockfd,sd,strlen(sd),0)<0){//向服务器发送数据
printf("send error");
exit(0);
}
if((n=recv(sockfd,buff,100,0))<0){//从服务器接受数据
printf("recv error");
exit(0);
}
buff[n] = '\0';
printf("%s",buff);
close(sockfd);
return 0;
}
运行结果
上一篇: 函数表达式(第七章笔记)