linux socket
一种简单的基于utp通信
客户端
- 创建套接字 使用socket
- 载入自己的绑定信息(客户端可以选择不绑定,这将使用系统随机分配的端口) IP Port
- 绑定信息(如果bing绑定) bing
- 载入服务端绑定信息 IP Port
- 设置缓冲,即要发送的信息存放处
- 使用 载入的服务端地址和端口 发送sendto
服务端
- 创建套接字 使用socket
- 载入自己的绑定信息(客户端可以选择不绑定,这将使用系统随机分配的端口) IP Port
- 绑定信息(如果bing绑定) bing
- 设置缓冲,即要接受的信息存放处
- 接受信息/监听端口 ** recvfrom**
客户端
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#define N 128
int main(int argc, char const *argv[]){
if(argc != 3 && argc != 5)
{
fprintf(stderr,
"C ---> S\n"
"Error: Missing operands!\n"
"Usage: %s [IP] [Port]\n"
"Example: %s 192.168.1.1 5000\n"
,argv[0],argv[0]);
exit(1);
}
int sockfd;
if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("fail to socket!\n");
exit(1);
}
printf("sockfd = %d\n",sockfd);
#if 1
if( argc == 5)
{
struct sockaddr_in clientaddr;
clientaddr.sin_family = AF_INET;
clientaddr.sin_addr.s_addr = inet_addr(argv[3]);
clientaddr.sin_port = htons(atoi(argv[4]));
if(bind(sockfd,(struct sockaddr *)&clientaddr,sizeof(clientaddr)) == -1)
{
perror("fail to bind");
exit(1);
}
}
#endif
struct sockaddr_in serveraddr;
socklen_t addrlen = sizeof(serveraddr);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));
char buf[N]="";
while(1)
{
fgets(buf,N,stdin);
buf[strlen(buf)-1] = '\0';
if(sendto(sockfd,buf,N,0,(struct sockaddr *)&serveraddr,addrlen) == -1)
{
perror("fail to sendto!\n");
exit(1);
}
}
close(sockfd);
return 0;
}
服务端
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#define N 128
int main(int argc,char const *argv[]){
if(argc != 3)
{
fprintf(stderr,
"S <--- C\n"
"Error: Missing operands!\n"
"Usage: %s [IP] [Port]\n"
"Example: %s 192.168.1.1 5000\n"
,argv[0],argv[0]);
exit(1);
}
int sockfd;
if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("fail to socket");
exit(1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_port = htons(atoi(argv[2]));
if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1)
{
perror("fail to bind");
exit(1);
}
char buf[N] = "";
struct sockaddr_in clientaddr;
socklen_t addrlen = sizeof(struct sockaddr_in);
while(1)
{
if(recvfrom(sockfd,buf,N,0,(struct sockaddr *)&clientaddr,&addrlen) == -1)
{
perror("fail to recvfrom");
exit(1);
}
printf("ip:%s,port:%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
printf("from client: %s\n",buf);
}
close(sockfd);
return 0;
}