搭建一个服务器的简单过程

首先我说下一下几个基本的步骤:
1、socket
2、bind绑定
3、listen
4、accpet
5、recv
6、发送

1.socket
int socket(int domain, int type, int protocol);
功能:
创建用来通信的套接字
参数:
domain:通信域
AF_INET
type:流式套接字
SOCK_STREAM
protocol:
默认为0
返回值:
成功返回文件描述符
失败返回-1
2.listen
int listen(int sockfd, int backlog);
功能:
监听客户端发送的三次握手链接请求
参数:
sockfd:套接字文件描述符
backlog:允许等待且尚未被处理的三次握手请求连接个数
返回值:
成功返回0
失败返回-1

3.connect
  int connect(int sockfd, const struct sockaddr *addr,
               socklen_t addrlen);
  功能:
	    向指定IP地址端口号发送三次握手链接请求
  参数:
		sockfd:套接字文件描述符
		addr:要链接的IP地址
		addrlen:地址长度
  返回值:
		成功返回0
		失败返回-1
		
4.accept
  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  功能:
		处理等待队列中第一个三次握手链接请求
  参数:
		sockfd:套接字文件描述符
		addr:接收发送三次握手端的IP地址信息
		addrlen:接收发送三次握手端的IP地址长度信息
  返回值:
		成功返回新的用来通信的文件描述符
		失败返回-1 

5.send
  ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  功能:
		发送信息
  参数:
		sockfd:通信的文件描述符
		buf:发送数据空间首地址
		len:发送数据长度
		flags:默认为0
  返回值:
		成功返回实际发送字节数
		失败返回-1 
		
6.recv
  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  功能:
		接收信息
  参数:
		sockfd:套接字文件描述符
		buf:存放数据空间首地址
		len:最大接收数据长度
		flags:默认为0
  返回值:
		成功返回实际接收字节数
		失败返回-1
		对方关闭套接字返回0

粘包问题:
	发送数据量小,接收数据量大时,数据会粘连到一起,并实现发送
	解决方法:
		1.每次发送数据时,产生时间间隔
		2.定长发送

下面我附上他的源代码
#include “head.h”

int main(int argc, const char *argv[])
{
int confd = 0;
int sockfd = 0;
int Ret = 0;
char TmpBuff[4096] = {0};
struct sockaddr_in SerAddr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockfd)
{
	perror("fail to socket");
	return -1;
}

SerAddr.sin_family = AF_INET;
SerAddr.sin_port = htons(50000);
SerAddr.sin_addr.s_addr = inet_addr("192.168.0.183");
Ret = bind(sockfd, (struct sockaddr *)&SerAddr, sizeof(SerAddr));
if (-1 == Ret)
{
	perror("fail to bind");
	return -1;
}

Ret = listen(sockfd, 10);
if (-1 == Ret)
{
	perror("fail to listen");
	return -1;
}

confd = accept(sockfd, NULL, NULL);
if (-1 == confd)
{
	perror("fail to accept");
	return -1;
}

Ret = recv(confd, TmpBuff, sizeof(TmpBuff), 0);
if (-1 == Ret)
{
	perror("fail to recv");
	return -1;
}
printf("RECV:%s\n", TmpBuff);

sprintf(TmpBuff, "%s ------echo----", TmpBuff);
Ret = send(confd, TmpBuff, strlen(TmpBuff)+1, 0);
if (-1 == Ret)
{
	perror("fail to send");
	return -1;
}

close(confd);
close(sockfd);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值