最近遇到socket相关内容,故整理一下,方便日后查阅
server
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
if(2 != argc)
{
printf("Usage: %s [option]\n", argv[0]);
printf("\toption:port\n");
return -1;
}
int len;
int sin_size;
int server_sockfd; //服务器端套接字
int client_sockfd; //客户端套接字
struct sockaddr_in my_addr; //服务器网络地址结构体
struct sockaddr_in remote_addr; //客户端网络地址结构体
char buf[BUFSIZE]; //数据传送缓冲区
memset(buf, 0, sizeof(buf));
memset(&my_addr, 0, sizeof(my_addr)); //数据初始化,清零
my_addr.sin_family = AF_INET; //设置为IP通信
my_addr.sin_addr.s_addr = INADDR_ANY; //服务器IP地址--允许连接到所有本地地址上
my_addr.sin_port = htons(atoi(argv[1])); //服务器端口号,此处从argv[1]获取端口
//创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return -1;
}
//设置端口复用
int opt = 1;
setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));
//将套接字绑定到服务器的网络地址上
if(bind(server_sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0)
{
perror("bind");
return -1;
}
//监听连接请求——监听队列长度为5
listen(server_sockfd, 5);
printf("server running at port: %s\n", inet_ntoa(my_addr.sin_addr));
sin_size = sizeof(struct sockaddr_in);
printf("Waiting to connect...\n");
//等待客户端连接请求
if((client_sockfd = accept(server_sockfd, (struct sockaddr *)&remote_addr, &sin_size)) < 0)
{
perror("accept");
return -1;
}
printf("accept client %s\n", inet_ntoa(remote_addr.sin_addr));
send(client_sockfd, "Welcome to my server\n", 21, 0); //发送欢迎信息
//接收客户端发送的数据,并将其返回发送给客户端——recv返回接收到的字节数,send返回发送的字节数
while(1)
{
if((len = recv(client_sockfd, buf, BUFSIZE, 0)) > 0)
{
buf[len] = '\0';
printf("receive: %s\n", buf);
if(send(client_sockfd, buf, len, 0) < 0)
{
perror("send");
}
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
if(3 != argc)
{
printf("Usage: %s [option1] [option2]\n", argv[0]);
printf("\toption1:IP\n");
printf("\toption2:port\n");
return -1;
}
int len;
int client_sockfd;
char buf[BUFSIZE];
memset(buf, 0, sizeof(buf));
struct sockaddr_in remote_addr;
memset(&remote_addr, 0, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr(argv[1]); //服务器IP地址
remote_addr.sin_port = htons(atoi(argv[2])); //服务器端口号
//创建套接字
if((client_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket");
return -1;
}
//将套接字绑定到服务器的网络地址
if(connect(client_sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr)) < 0)
{
perror("connect");
return -1;
}
printf("connected to server\n");
len = recv(client_sockfd, buf, BUFSIZE, 0); //接收服务器消息
buf[len] = '\0';
printf("%s\n", buf); //打印服务器端消息
//循环发送接收消息
while(1)
{
printf("Enter string to send:\n");
scanf("%s", buf);
if(!strcmp(buf, "quit"))
break;
len = send(client_sockfd, buf, strlen(buf), 0);
len = recv(client_sockfd, buf, BUFSIZE, 0);
buf[len] = '\0';
printf("received:%s\n", buf);
}
close(client_sockfd); //关闭套接字
return 0;
}