2.Linux网络编程-socket函数和C2S实现

1.TCP客户/服务器模型
TCP服务器:socket()–>bind()–>listen()–>accept()–>block直至客户连接到达---->read()–>处理请求–>write()---->read()–>close()

TCP客户端:socket()—>connect()---->write()----->read()---->close()

2.回射客户/服务器
返回客户发送的信息;

3.socket函数
包含头文件<sys/socket.h>
功能:创建一个套接字用于通信;
原型:int socket(int domain, int type, int protocol);
参数:domain:指定通信协议族(protocol family);
type:指定socket类型,流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW;
protocol:协议类型;
返回值:成功返回非负整数,它与文件描述符类似,我们把它称为套接口描述子,简称套接字。失败返回-1;

4.bind函数
包含头文件<sys/socket.h>
功能:绑定一个本地地址到套接字;
原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:sockfd:socket函数返回的套接字;
addr:要绑定的地址;
addrlen:地址长度;
返回值:成功返回0,失败返回-1;

5.listen函数
包含头文件<sys/socket.h>
功能:将套接字用于监听进入的连接;
原型:int listen(int sockfd, int backlog);
参数:sockfd:socket函数返回的套接字;
backlog:规定内核为此套接字排队的最大连接个数;
返回值:成功返回0,失败返回-1;

6.accept函数
包含头文件<sys/socket.h>
功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞;
原型:int accept(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:sockfd:socket函数返回的套接字;
addr:要绑定的地址;
addrlen:地址长度;
返回值:成功返回非负整数,失败返回-1;

7.write函数
包含头文件<unistd.h>

8.read函数
包含头文件<unistd.h>

/*server side:begin

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

using namespace std;

#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)

int main()
{	
	int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sockfd<0)
		ERR_EXIT("socket");
	struct sockaddr_in servaddr;
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(5188);
	//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	//inet_aton("127.0.0.1", &servaddr.sin_addr);
	
	if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)))
		ERR_EXIT("bind");
	
	int listenfd = listen(sockfd, SOMAXCONN);
	if(listenfd<0)
		ERR_EXIT("listen");
	
	struct sockaddr_in peeraddr;
	socklen_t peerlen = sizeof(peeraddr);
	int conn = accept(sockfd, (struct sockaddr*)&peeraddr, &peerlen);
	if(conn<0)
		ERR_EXIT("accept");
	
	char recvbuf[1024];
	while(1)
	{
		memset(recvbuf, 0, sizeof(recvbuf));
		int ret = read(conn, recvbuf, sizeof(recvbuf));
		fputs(recvbuf, stdout);
		write(conn, recvbuf, ret);
	}
	close(conn);
	close(sockfd);
	return 0;
}
server side:end*/


/*client side:begin

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

using namespace std;

#define ERR_EXIT(m) do{ perror(m); exit(EXIT_FAILURE);}while(0)

int main()
{	
	int sockfd;
	if((sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
		ERR_EXIT("socket");
	struct sockaddr_in servaddr;
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(5188);
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	//inet_aton("127.0.0.1", &servaddr.sin_addr);
	
	if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))<0)
		ERR_EXIT("connect");
	char sendbuf[1024] = {0};
	char recvbuf[1024] = {0};
	while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
	{
		write(sockfd, sendbuf, strlen(sendbuf));
		read(sockfd, recvbuf, sizeof(recvbuf));
		fputs(recvbuf, stdout);
		memset(&sendbuf, 0, sizeof(sendbuf));
		memset(&recvbuf, 0, sizeof(recvbuf));
	}
	close(sockfd);
	return 0;
}

client side:end*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值