It's our wits that make us men.

socket

Posted on By tkly

最近遇到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;
}