需要用到的头文件:
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
客户端实现:
int main(int sragc,char**argv)
{
//(1)创建套接字 socket()
int sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd == -1)
{
perror("server socket error:");
return -1;
}
//(2)准备服务器的网络地址
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&server_addr.sin_addr);
//addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机IP
//(3)连接服务器 connect()
int re = connect(sock_fd,(const struct sockaddr *)&server_addr,sizeof(server_addr));
if(re == -1)
{
perror("connect error:");
close(sock_fd);
return -1;
}
printf("connect success\n");
//(4)进行通信 (读写,发送接收)
char buf[128] = {0};
fgets(buf,128,stdin);
re = sendto(sock_fd,buf,strlen(buf),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(re == -1)
{
perror("sendto error:");
close(sock_fd);
return -1;
}
char recv_buf[128] = {0};
//不需要对方地址
//ssize_t recvfrom(sock_fd,recv_buf,128,0,NULL,NULL);
struct sockaddr_in addr;
int len = sizeof(addr);
recvfrom(sock_fd,recv_buf,128,0,(struct sockaddr *)&addr,&len);
printf("recv_buf = %s\n",recv_buf);
//(5)断开连接 close
close(sock_fd);
}
服务端实现:
int main(int sragc,char**argv)
{
//(1)创建套接字 socket()
int sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd == -1)
{
perror("server socket error:");
return -1;
}
//(2)准备服务器的网络地址
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&server_addr.sin_addr);
//addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机IP
//设置套接字的选项
int val = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEPORT,(void*)&val,sizeof(int));
//(3)绑定服务器 bind()
int re = bind(sock_fd, (const struct sockaddr *)&server_addr,sizeof(server_addr));
if(re == -1)
{
perror("bind error:");
return -1;
}
printf("bind success\n");
//(4)监听客户端的请求 listen()
re = listen(sock_fd, 3);
if(re == -1)
{
perror("listen error:");
return -1;
}
printf("listen success\n");
//(5)接受客户端的请求 accept()
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int clinet_fd = accept(sock_fd,(struct sockaddr*)&client_addr,&len);
if(clinet_fd == -1)
{
perror("accept error:");
return -1;
}
printf("accept success\n");
printf("client ip : %s\n",inet_ntoa(client_addr.sin_addr));
//(6)进行通信 (读写,发送接收)
//接收
char recv_buf[128] = {0};
struct sockaddr_in addr;
int len_1 = sizeof(addr);
recvfrom(clinet_fd,recv_buf,128,0,(struct sockaddr *)&addr,&len_1);
printf("recv_buf = %s\n",recv_buf);
//发送
char buf[128] = {0};
fgets(buf,128,stdin);
re = sendto(clinet_fd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr));
if(re == -1)
{
perror("sendto error:");
close(sock_fd);
return -1;
}
//(7)断开连接 close
close(sock_fd);
}