Linux下简单的网络编程笔记(模拟简单的服务器与客户端的通信 1-服务器端)

一.服务器端     (刚入门的小白一个,如果发现有错误的地方麻烦提醒一下!)

(一).建立连接的条件:服务器必须处于监听状态,由客户端发起连接请求

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(sockfdBacklog);

           这个函数中的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;
}

       


猜你喜欢

转载自blog.csdn.net/qq_40585834/article/details/79764552