一.服务器端 (刚入门的小白一个,如果发现有错误的地方麻烦提醒一下!)
(一).建立连接的条件:服务器必须处于监听状态,由客户端发起连接请求
1.建立连接
(1)服务器端:*1.创建套接字:socket (IP类型 , 协议类型, 其他协议);
IP类型涉及两种,IPV4:设置为AF_INET IPV6:设置为AF_INET6
协议类型两种,TCP:设置为 SOCK_STEAM UDP:设置为 SOCK_DGRAM
其他协议本节中不涉及,默认为置0; 返回值为一个标志符,暂且设为sockfd
*2.绑定sockfd、IP和端口:bind(sockfd ,包含传入IP,端口号协议类型的机构体 ,结构体的长度)
该结构体为:struct sockaddr_in addr={0}
进行初始化:addr.sin_family=AF_INET; addr.sin_port=htons(给服务器定义的端口号);
addr.sin_addr.s_addr=inet_addr("192.168.1.102");
端口号转换的函数四种(上面的htons函数)
1.uint32_t | htonl(端口号);主机端口号转换为32位2进制网络传输形式 host to net long
2.uint16_t | htons(); host to net short
3. ..... | ntohl();
4. ..... | ntohs();
*3.服务器端进行监听:listen(sockfd ,Backlog);
这个函数中的Backlog暂时实在是搞不清楚,查了一下百度,好像涉及什么内核,队列之类的
完全看不懂,如果有大佬知道的话麻烦留个言,赐个教,在下面的简单程序中直接将其宏定义
成了100
*4.服务器阻塞等待客户端的连接:accept(sockfd , 存储返回客户机IP、端口的的一个结构体 ,结构体的长度 );
这个结构体和*2中的结构体类型相同,自己定义,初始化为0,将其传入到accept函数中,客户端连接后会被
赋值 注意强制转换(struct sockaddr *)&
TCP/UDP段结构中,端口地址都是16位,在0~65535之间,1024以内的端口号不能自己拿来用,自己定义的话一般在1024~
5000之间,服务器一般定义在5000~....之间
辅助性函数
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#define SVERPNET "192.168.0.100" //服务器ip地址;
#define Myport 6003 //服务器的端口号;
#define Backlog 100
int main(int argc,char *argv[])
{
//char *ret=0;
/* struct in_addr addr={0}; //定义接收结构体
ret=inet_pton(AF_INET,SVERPNET,&addr); //辅助性函数1 :将点分式IP地址转换为32位2进制进行网络传输
if(ret!=1)
{
printf("inet_pton error\n");
return -1;
}
else{
printf("addr=0x%x\n",addr.s_addr);
return 0;
}*/
// struct in_addr addr={0};
//char buf[50]={0};
//addr.s_addr=0x6601a8c0;
//inet_ntop(AF_INET,&addr,buf,sizeof(buf));
//printf("%s\n",buf);
//1.创建套接字
//2.绑定端口和ip地址
int sockfd=-1; //套接字返回值
int bindfd=-1;
int listenfd=-1; //监听函数返回值
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sockfd)
{
perror("socket"); //返回值验证
return -1;
}
printf("%d\n",sockfd);
/*上面部分为创建套接字*/
struct sockaddr_in svraddr={0}; //bind函数需要传入的ip端口结构体
svraddr.sin_family=AF_INET; //1 //ip类型 ipv4;
svraddr.sin_port=htons(Myport); //2 //端口号 需要转换成机器能识别的端口号 不能直接等于6003
svraddr.sin_addr.s_addr=inet_addr(SVERPNET); //3 //ip
bindfd=bind(sockfd,(const struct sockaddr *)&svraddr,sizeof(svraddr));
if(-1==bindfd)
{
perror("bind");
return -1;
}
printf("bind success.\n");
printf("bindfd=%d\n",bindfd);
//3.第三步:listen 监听端口
listenfd=listen(sockfd,Backlog);
if(-1==listenfd)
{
perror("listen");
return -1;
}
//4.第四步:accept服务器阻塞等待连接
struct sockaddr_in Acceptretaddr={0};
socklen_t lenth={0};
accept(sockfd,(struct sockaddr *)&Acceptretaddr,&lenth);
printf("hahahah\n");
return 0;
}