Linux系统编程—网络编程—socket代码实现
Posted 是光哥呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统编程—网络编程—socket代码实现相关的知识,希望对你有一定的参考价值。
socket代码实现
一、服务端步骤:
1.socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
第一个参数domain设置为“AF_INET”。
第二个参数是套接口的类型:SOCK_STREAM或
SOCK_DGRAM。第三个参数设置为0。
系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。
2.bind
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
第一个参数sockfd是由socket()调用返回的套接口文件描述符。
第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。
第三个参数addrlen可以设置成sizeof(structsockaddr)。
查找struct sockaddr_in过程
i不区分大小写,r递归,n显示行号 *在当前目录底下
3.listen
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
sockfd 一个已绑定未被连接的套接字描述符
backlog 连接请求队列(queue of pending connections)
的最大长度(一般由2到4)。用SOMAXCONN则为系统给出的最大值
4.accept
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
socket:套接口描述字,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
成功返回一个新的套接字描述符,失败返回-1
5.read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
1.参数一为被读取的文件对应的文件描述符,第二个参数为缓存区,第三个参数为读取的字节数
2.功能:读取fd对应的文件,并将读取的数据保存到buf,以nbytes为读取单位
3.返回值:返回读取的字节数,-1表示读取失败,0表示读取结束
6.write
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
1.参数一为被写入的文件对应的文件描述符,第二个参数为缓存区,第三个参数为写入的字节数
2.功能:将buf里的数据写入fd对应的文件,以n为写入单位
3.返回值:返回写入的字节数,-1表示写入失败
服务器端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
int s_fd;
int n_read;
char readbuf[128];
char *msg="i get your connect";
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.socket
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd==-1){
perror("socket");
exit(-1);
}
//2.bind
s_addr.sin_family =AF_INET;//英特尔网域
s_addr.sin_port =htons(8989);//端口号 低于3000一般是操作系统用的 用户一般用5000-9000 htons()生成网络字节序
inet_aton("127.0.0.1",&s_addr.sin_addr);
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3.listen
listen(s_fd,10);//监听10个连接
//4.accept
int clen=sizeof(struct sockaddr_in);
int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd==-1){
perror("accept");
}
printf("get connetc:%s\\n",inet_ntoa(c_addr.sin_addr));
//5.read
n_read=read(c_fd,readbuf,128);
if(n_read==-1){
perror("read");
}else{
printf("get message:%d,%s\\n",n_read,readbuf);
}
//6.write
write(c_fd,msg,strlen(msg));
return 0;
}
二、客户端步骤:
1.socket
同服务端
2.connect
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。
第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。
第三个参数可以使用sizeof(structsockaddr)而获得。
3.send
同服务端
4.read
同服务端
客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
int c_fd;
int n_read;
char readbuf[128];
char *msg="msg from client";
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.socket
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1){
perror("socket");
exit(-1);
}
c_addr.sin_family =AF_INET;//英特尔网域
c_addr.sin_port =htons(8989);//端口号 低于3000一般是操作系统用的 用户一般用5000-9000 htons()生成网络字节序
inet_aton("127.0.0.1",&c_addr.sin_addr);
//2.connect
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1){
perror("connect");
exit(-1);
}
//3.send
write(c_fd,msg,strlen(msg));
//4.read
n_read=read(c_fd,readbuf,128);
if(n_read==-1){
perror("read");
}else{
printf("get message from serve:%d,%s\\n",n_read,readbuf);
}
return 0;
}
运行效果如图:
以上是关于Linux系统编程—网络编程—socket代码实现的主要内容,如果未能解决你的问题,请参考以下文章