socket多线程

本文详细介绍了如何在服务器端使用Socket进行多线程编程,涵盖了创建、绑定、监听、接受连接、发送和接收数据等关键步骤,同时讲解了套接字的选项设置和状态查询,为实现高性能的网络服务提供了基础指导。
摘要由CSDN通过智能技术生成
BSD Socket API
  • socket() 创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源。
  • bind() 一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。
  • listen() 用于服务器端,使一个绑定的TCP套接字进入监听状态。
  • connect() 用于客户端,为一个套接字分配一个自由的本地端口号。 如果是TCP套接字的话,它会试图获得一个新的TCP连接。
  • accept() 用于服务器端。 它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。
  • send()recv(),或者write()read(),或者recvfrom()sendto(), 用于往/从远程套接字发送和接受数据。
  • close() 用于系统释放分配给一个套接字的资源。 如果是TCP,连接会被中断。
  • gethostbyname()gethostbyaddr() 用于解析主机名和地址。
  • select() 用于修整有如下情况的套接字列表: 准备读,准备写或者是有错误。
  • poll() 用于检查套接字的状态。 套接字可以被测试,看是否可以写入、读取或是有错误。
  • getsockopt() 用于查询指定的套接字一个特定的套接字选项的当前值。
  • setsockopt() 用于为指定的套接字设定一个特定的套接字选项。

服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>

#define BUF_SIZE 1024

void thread_socket_function(void *args) {

	int fd = (int) args;
	int rdcnt, wrcnt;
	char buf[BUF_SIZE];
	printf("sockfd:%d\n", fd);
	while (1) {
		rdcnt = read(fd, buf, BUF_SIZE);
		if (rdcnt == -1) {
			perror("read");
		} else {
			if (!strcmp(buf, "bye")) {
				break;
			} else {
				printf("recv:%s\n", buf);
				strcpy(buf, "receive success!");
				wrcnt = write(fd, buf, strlen(buf) + 1);
				if (wrcnt == -1) {
					perror("write");
				}
			}
		}
	}
	close(fd);
	pthread_exit(NULL);

}

int main(int argc, char **argv) {

	int server_sockfd;
	struct sockaddr_in server_addr;

	server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (server_sockfd == -1) {
		perror("socket");
		return -1;
	}
	memset(&server_addr, 0, sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = 8888;
	server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	bind(server_sockfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
	listen(server_sockfd, 5);

	for (;;) {
		int client_sockfd;
		int client_len = sizeof(struct sockaddr_in);
		struct sockaddr_in client_addr;

		pthread_t thread;
		int ret;

		client_sockfd = accept(server_sockfd, (struct sockaddr*) &client_addr,
				(socklen_t *__restrict) &client_len);

		ret = pthread_create(&thread, NULL, (void *) &thread_socket_function,
				(void *) client_sockfd);
		if (ret) {
			perror("pthread_create");
			continue;
		}
	}
	pthread_exit(NULL);

	return 0;
}

客户端代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define BUF_SIZE 1024

int main(int argc, char **argv) {

	int client_sockfd;

	struct sockaddr_in address;
	int ret;
	char buf[BUF_SIZE];
	int client_len = sizeof(struct sockaddr_in);

	client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
	address.sin_family = AF_INET;
	address.sin_addr.s_addr = inet_addr("127.0.0.1");
	address.sin_port = 8888;

	ret = connect(client_sockfd, (struct sockaddr *) &address, client_len);
	if (ret == -1) {
		perror("connect");
		return -1;
	}
	while (1) {
		scanf("%s", buf);
		write(client_sockfd, buf, strlen(buf) + 1);

		if (!strcmp(buf, "bye")) {
			break;
		}
		read(client_sockfd, buf, BUF_SIZE);
		printf("recev:%s\n", buf);
	}
	close(client_sockfd);

	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值