今日任务:
TCP\UDP服务端客户端通信
服务端:
#include
#include
#include
#include
#include
#include
#include
//自定义报错提示
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
/*
* function: TCP服务端
* @param [ in]
* @param [out]
* @return
*/
int main(int argc, const char *argv[])
{
//1.创建socket套接字,
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0){
ERR_MSG("socket");
return -1;
}
puts("socket create");
//允许端口快速复用
int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速复用成功\n");
//2.绑定服务器IP和端口号bind
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(SER_PORT);
addr.sin_addr.s_addr=inet_addr(SER_IP);
if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
ERR_MSG("bind");
return -1;
}
puts("bind success");
//3.建立监听listen
if(listen(sfd,128)<0){
ERR_MSG("listen");
return -1;
}
puts("listen suucess");
//4.等待客户端连接, accept
struct sockaddr_in cli_addr;
socklen_t cli_addrlen=sizeof(cli_addr);
int cfd=accept(sfd,(struct sockaddr*)&cli_addr,&cli_addrlen);
if(cfd<0){
ERR_MSG("accept");
return -1;
}
puts("accept");
//5.接受发送消息recv;send
char buf[128];
while(1){
bzero(buf,sizeof(buf));
int recv_res=recv(cfd,buf,sizeof(buf),0);
if(recv_res<0){
ERR_MSG("recv");
return -1;
}else if(recv_res==0){
printf("socket peer has shutdown\n");
break;
}
puts("recv success");
printf("[%s:%d]:%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),buf);
if(strcmp(buf,"quit")==0)
break;
strcat(buf,"-----i has received");
int send_res=send(cfd,buf,sizeof(buf),0);
if(send_res<0){
ERR_MSG("send");
return -1;
}
puts("send success");
}
//6.关闭
close(cfd);
close(sfd);
return 0;
}
客户端
#include
#include
#include
#include
#include
#include
#include
//自定义报错提示
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
/*
* function: TCP客户端
* @param [ in]
* @param [out]
* @return
*/
int main(int argc, const char *argv[])
{
//1.创建socket套接字,
int cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd<0){
ERR_MSG("socket");
return -1;
}
puts("socket create");
//允许端口快速复用
int reuse = 1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速复用成功\n");
//2.连接服务端connect
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(SER_PORT);
addr.sin_addr.s_addr=inet_addr(SER_IP);
if(connect(cfd,(struct sockaddr*)&addr,sizeof(addr))<0){
ERR_MSG("connect");
return -1;
}
puts("connect success");
//5.接受发送消息recv;send
char buf[128];
while(1){
bzero(buf,sizeof(buf));
printf("请输入>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
if(strcmp(buf,"quit")==0)
break;
int send_res=send(cfd,buf,sizeof(buf),0);
if(send_res<0){
ERR_MSG("send");
return -1;
}
puts("send success");
bzero(buf,sizeof(buf));
int recv_res=recv(cfd,buf,sizeof(buf),0);
if(recv_res<0){
ERR_MSG("recv");
return -1;
}else if(recv_res==0){
printf("socket peer has shutdown\n");
break;
}
puts("recv success");
printf("[%s:%d]:%s\n",SER_IP,SER_PORT,buf);
}
//6.关闭
close(cfd);
return 0;
}
运行结果:
服务端:
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
//自定义报错提示
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
int main(int argc, const char *argv[])
{
//1.创建socket套接字
int sfd=socket(AF_INET,SOCK_DGRAM,0);
if(sfd<0){
ERR_MSG("socket");
return -1;
}
puts("socket success");
//2.绑定IP和端口号
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(SER_PORT);
addr.sin_addr.s_addr=inet_addr(SER_IP);
if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){
ERR_MSG("bind");
return -1;
}
puts("bind success");
//3.接受和发送消息
//
struct sockaddr_in src_addr;
socklen_t addrlen=sizeof(src_addr);
char buf[128];
while(1){
bzero(buf,sizeof(buf));
int recv_res=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,&addrlen);
if(recv_res<0){
ERR_MSG("recvfrom");
return -1;
}
puts("recvfrom success");
printf("[%s:%d]:%s\n",inet_ntoa(src_addr.sin_addr),ntohs(src_addr.sin_port),buf);
if(strcmp(buf,"quit")==0)
break;
strcat(buf,"-----i has received");
int send_res=sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&src_addr,addrlen);
if(send_res<0){
ERR_MSG("sendto");
return -1;
}
puts("sendto success");
}
//4.关闭
close(sfd);
return 0;
}
客户端
#include
#include
#include
#include /* See NOTES */
#include
#include
#include
#include
//自定义报错提示
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
#define SER_PORT 8888
#define SER_IP "192.168.125.2"
int main(int argc, const char *argv[])
{
//1.创建socket套接字
int cfd=socket(AF_INET,SOCK_DGRAM,0);
if(cfd<0){
ERR_MSG("socket");
return -1;
}
puts("socket success");
//3.接受和发送消息
//目标地址信息
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(SER_PORT);
addr.sin_addr.s_addr=inet_addr(SER_IP);
socklen_t addrlen=sizeof(addr);
//记录接受信息的目标地址信息
struct sockaddr_in recv_addr;
socklen_t recv_addrlen=sizeof(recv_addr);
char buf[128];
while(1){
printf("请输入>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0';
int send_res=sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&addr,addrlen);
if(send_res<0){
ERR_MSG("sendto");
return -1;
}
puts("sendto success");
if(strcmp(buf,"quit")==0)
break;
bzero(buf,sizeof(buf));
int recv_res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&recv_addr,&recv_addrlen);
if(recv_res<0){
ERR_MSG("recvfrom");
return -1;
}
puts("recvfrom success");
printf("[%s:%d]:%s\n",inet_ntoa(recv_addr.sin_addr),ntohs(recv_addr.sin_port),buf);
}
//4.关闭
close(cfd);
return 0;
}
运行结果:
今日思维导图:
somthing error:UDP的客户端处
一开始addrlen只有定义没有赋值,白天的时候有报错给他加了一个初始值;晚上突然一下可以一下不可以,找了找错误改了医改,应该也是这个;