您的位置:首页 > 理论基础 > 计算机网络

网络编程基础(服务器,客户端)

2013-07-16 15:50 555 查看
服务器端编程步骤:

1、创建套接字socket, 初始化网络结构struct sockaddr_in

2、bind绑定 (服务器必须执行此函数,客户端可选)

3、listen 设置监听数

4、accept接受连接请求

客户端编程步骤:

1、创建套接字socket, 初始化网络结构

2、connect向服务器发送连接请求

/*************************

服务器端

*************************/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

typedef struct sockaddr SA; //给通用地址结构定义别名SA

int main(int argc, char *argv[])

{

if (argc != 3)

{

printf("usage:%s <ip> <port>\n", argv[0]);

exit(-1);

}

int listenfd, connfd;

struct sockaddr_in servaddr, peeraddr; //声明网络地址结构

socklen_t peerlen;

//XXX int socket(int domain, int type, int protocol); //创建套接字,并将返回的套接字ID赋给listenfd

if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

{

perror("fail to socket");

exit(-1);

}

bzero(&servaddr, sizeof(servaddr)); //清零网络地址结构

servaddr.sin_family = PF_INET; //internet协议

servaddr.sin_port = htons(atoi(argv[2])); //atoi函数将字符串转为整型,htons函数将主机字节序转为网络字节序

servaddr.sin_addr.s_addr = inet_addr(argv[1]); //inet_addr函数将IP地址的字符串形式转为无符号整型的形式

//XXX int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

if (bind(listenfd, (SA*)(&servaddr), sizeof(servaddr)) < 0)

{

perror("bind");

exit(-1);

}

//XXX int listen(int sockfd, int backlog);

if (listen(listenfd, 5) < 0) //设置监听链接的最大数目,backlog指定了正在等待连接的最大队列长度

{

perror("listen");

exit(-1);

}



peerlen = sizeof(peeraddr);

while (1)

{

//XXX int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

if ((connfd = accept(listenfd, (SA*)&peeraddr, &peerlen)) < 0) //接受连接请求,并返回一个新的套接字ID给connfd

{

perror("accept");

exit(-1);

}

printf("connect from [%s:%d]\n", inet_ntoa(peeraddr.sin_addr), //inet_ntoa函数将IP地址的整型形式转为字符串形式

ntohs(peeraddr.sin_port)); //ntohs函数将网络的字节序转为主机的字节序

close(connfd);

}

return 0;

}

/*************************

客户端

************************/

#include <stdio.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <stdlib.h>

#include <unistd.h>

typedef struct sockaddr SA;

int main(int argc, char *argv[])

{

if (argc != 3)

{

printf("Usage: %s <ip> <port>\n", argv[0]);

return -1;

}

int sockfd;

struct sockaddr_in servaddr;

if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

{

perror("socket");

exit(-1);

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = PF_INET;

servaddr.sin_port = htons(atoi(argv[2]));

servaddr.sin_addr.s_addr = inet_addr(argv[1]);

if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) < 0)

{

{

perror("accept");

exit(-1);

}

}

close(sockfd);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: