首页 / LINUX / Linux c socket编程
Linux c socket编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux c socket编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11519字,纯文字阅读大概需要17分钟。
内容图文
![Linux c socket编程](/upload/InfoBanner/zyjiaocheng/964/1da13661023b4ea8b23fd02940fcdf09.jpg)
Linux c socket编程:简单的客户端(client)和服务端(server)实现
? 分享到: 2 ????发布时间:2013-8-13??????本文导语:?1 基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的。网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也有一个类似于打开文件的函数:socket(),调用socket(),该函数返回一个整型的socket...
1 基本
是通过提供套接字(socket)来进行的。的socket是一种特殊的I/O,socket也是一种。socket也有一个类似于打
开的函数:socket(),调用socket(),该函数返回一个整型的socket的,随后的建立、数据传输等操作也都是通过该socket实现。
1)socket函数
函数:
1 | int socket( int domain, int type, int protocol); |
功能:
调用成功,返回socket文件描述符;失败,返回-1,并设置
说明:
指明所使用的族,通常为PF_,表示/协议;
参数指定socket的类型,基本上有三种:套接字、数据报套接字、原始套接字
通常"0"。
两个网络之间的一个包括五种:通信协议、本地协议、本地、远端主机地址和远端协议端口。socket中包含这五种信息。
2)函数
函数原型:
1 | int bind( int sock_fd, struct sockaddr_in *my_addr, int addrlen); |
功能说明:
将套接字和指定的端口相连。成功返回0,否则,返回-1,并置errno.
参数说明:
sock_fd是调用socket函数,
my_addr是一个包含有本机及端口号等信息的sockaddr类型的;
sockaddr_结构类型是用来保存socket信息的:
struct sockaddr_in {
_family;
short int sin_;
struct in_addr sin_addr;
unsigned sin_[8];
};
addrlen为sockaddr的。
3)函数
函数原型:
1 | int connect( int sock_fd, struct sockaddr *serv_addr, int addrlen); |
功能说明:
发送。成功返回0,否则返回-1,并置errno。
参数说明:
sock_fd 是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是结构sockaddr_in的长度。
4)函数
函数原型:
1 | int listen( int sock_fd, int backlog); |
功能说明:
等待指定的端口的出现客户端连接。调用成功返回0,否则,返回-1,并置errno.
参数说明:
sock_fd 是socket()函数返回值;
指定在请求中允许的最大请求数
5)accecpt函数
函数原型:
1 | int accept( int sock_fd, struct sockadd_in* addr, int addrlen); |
功能说明:
用于接受客户端的服务请求,成功返回新的套接字描述符,失败返回-1,并置errno。
参数说明:
sock_fd是被监听的socket描述符,
addr通常是一个指向sockaddr_in的指针,
addrlen是结构sockaddr_in的长度。
6)write函数
函数原型:
1 | ssize_t write( int fd, const void *buf, size_t nbytes) |
功能说明:
write函数将buf中的nbytes字节写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量.
在网络程序中,当我们向套接字文件描述符写时有俩种可能:
(1)write的返回值大于0,表示写了部分或者是全部的.
(2)返回的值小于0,此时出现了.需要根据错误类型来处理.
如果错误为表示在写的时候出现了错误.
如果错误为表示网络连接出现了问题.
7)read函数
函数原型:
1 | ssize_t read( int fd, void *buf, size_t nbyte) |
函数说明:
read函数是负责从fd中读取内容.当读成功时,read返回实际所读的字节数,如果返回的值是0 表示已经读到文件的结束了,小于0表示出现了错误.
如果错误为EINTR说明读是由中断引起的,
如果错误是ECONNREST表示网络连接出了问题.
8)close函数
函数原型:
1 | int close(sock_fd); |
说明:
当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:
函数运行成功返回0,否则返回-1
2 的函数说明
1) 网络字节及其函数
(1) 网络字节顺序
每一台机器内部对变量的字节存储顺序不同,而网络的数据是一定要统一顺序的。所以对内部字节表示顺序与网络字节顺序不同的机器,一定要对数据进行转换,从程序的可移植性要求来讲,就算本机的内部字节表示顺序与网络字节顺序相同也应该在传输数据以前先调用数据转换函数,以便程序到机器上后能正确执行。真正转换还是不转换是由系统函数自己来决定的。
(2) 有关的转换函数
12345678 | unsigned short int htons(unsigned short int hostshort): //主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes ? unsigned long int htonl(unsigned long int hostlong): //主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes ? unsigned short int ntohs(unsigned short int netshort): //网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes ? unsigned long int ntohl(unsigned long int netlong): //网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes |
注:以上函数原型定义在netinet/in.h里
2)IP地址转换
有三个函数将点形式表示的IP地址与32位网络字节顺序的形式的IP地址进行转换
(1) unsigned int inet_addr( char * ):该函数把一个用数字和点表示的IP地址的字符串转换成一个无符号长整型,如:
12 | struct sockaddr_in ina; ina.sin_addr.s_addr=inet_addr( "222.216.117.11" ); |
该函数成功时:返回转换结果;失败时返回INADDR_NONE,该常量=-1,二进制的无-1相当于255.255.255.255,这是一个地址,所以在程序中调用iner_addr()时,一定要人为地对调用失败进行处理。由于该函数不能处理广播地址,所以在程序中应该使用函数inet_aton()。
(2)int inet_aton(const char * cp,struct in_addr * inp):此函数将字符串形式的IP地址转换成二进制形式的IP地址;成功时返回1,否则返回0,转换后的IP地址存储在参数inp中。
(3) char * inet_ntoa(struct in):将32位二进制形式的ip地址转换为数字点形式的ip地址,结果在函数返回值中返回,返回的是一个指向串的指针。
3)字节处理函数
Socket地址是多字节数据,不是以空字符结尾的,这和中的字符串是不同的。Linux提供了两组函数来处理多字节数据,一组以b()开头,是和系统的函数,另一组以mem()开头,是 C提供的函数。
以b开头的函数有:
(1) bzero(void * s,int n):将参数s指定的内存的n个字节设置为0,通常它用来将套接字地址清0。
(2) void bcopy(const void * ,void * dest,int n):从参数src指定的内存区域拷贝指定数目的字节内容到参数dest指定的内存区域。
3 简单的客户端()和()实现
1) 客户端源码:
12345678910111213141516171819202122232425262728293031323334353637 | #include <stdio.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> // gcc -g -o simple_client simple_client.c int main( int argc, char *argv[]) { ???? char ip[20]={ "192.168.10.23" }; ???? int port=10000; ???? int server_fd; ???? struct sockaddr_in server_listen_addr; ???? bzero(&server_listen_addr, sizeof (server_listen_addr)); ???? server_listen_addr.sin_family=AF_INET; ???? server_listen_addr.sin_port=htons(port); ???? inet_pton(AF_INET, "192.168.10.23" ,( void *)&server_listen_addr.sin_addr); ??? // inet_aton(ip,&server_listen_addr.sin_addr); ??? // bzero(&(server_listen_addr.sin_zero),8); ???? server_fd=socket(AF_INET,SOCK_STREAM,0); ???? int ret=connect(server_fd,( const struct sockaddr *)&server_listen_addr, ???????????????????? sizeof ( struct sockaddr));????? ????? printf ( "server_fd=[%d] ret=[%d]n" ,server_fd,ret); ????? if (ret<0) ????? { ?????? perror ( "error: socket connect!" );??????? ?????? exit (1); ????? } ????? char data[20]={ "good luck!n" }; ????? int num=send(server_fd,( void *)data, strlen (data),0); ????? printf ( "send bytes[%d][%s]n" ,num,data); ????? close(server_fd); ???? return 1; } |
2)服务端源码:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | #include <stdio.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> //gcc -g -o simple_server simple_server.c int main( int argc, char *argv[]) { ???? int port=10000; ???? int server_listen_fd; ???? int server_accept_fd; ???? struct sockaddr_in server_listen_addr; ???? struct sockaddr_in server_accept_addr; ???? bzero(&server_listen_addr, sizeof (server_listen_addr)); ???? bzero(&server_accept_addr, sizeof (server_accept_addr)); ???? server_listen_addr.sin_family=AF_INET;? ???? server_listen_addr.sin_addr.s_addr=INADDR_ANY; ???? server_listen_addr.sin_port=htons(port); ???? server_listen_fd=socket(AF_INET,SOCK_STREAM,0); ???? if (-1==server_listen_fd) ????? { ??????? perror ( "fail to create socket!" ); ??????? exit (1); ????? } ???? if (bind(server_listen_fd,( struct sockaddr*)&server_listen_addr, ???????????? sizeof (server_listen_addr))==-1) ?????? { ???????? perror ( "can't to bind" ); ???????? exit (1); ?????? } ????? if (listen(server_listen_fd,10)==-1) ?????? { ???????? perror ( "can't to bind" ); ???????? exit (1); ?????? } ?????? while (1) ???????? {? ?????????? int size= sizeof (server_accept_addr); ?????????? printf ( "server socket begin accept:n" ); ?????????? server_accept_fd=accept(server_listen_fd,( struct sockaddr*)&server_accept_addr,&size); ?????????? printf ( "accept con_fd=%dn" ,con_fd); ?????????? if (server_accept_fd<0) ?????????? {??????????? ?????????????? perror ( "error:socket accept!exited!n" );??????????? ?????????????? exit (1);??????????? ?????????? } ?????????? int num=0; ?????????? char data[200]={0};????? ?????????? int ret=read(server_accept_fd,( void *)data,199);??????? ?????????? close(server_accept_fd); ?????????? printf ( "DATA:[%s]n" ,data); ???????? } ???? return 1; } |
以上代码均在 5.4上通过。
- 对于用客户端上网的用户(客户端不支持linux)如何在linux下上网?
- 在linux下开发手机客户端或pc客户端交互的服务器,需要学哪些知识?
- linux端是服务器,客户端连接后,有时并不知道客户端断开,怎么侦测?
- linux 能ping通客户端ip,但ping不通客户端的域名。
- linux网络编程(怎样实现两个客户端之间的通信)
- linux的bbs客户端 qterm
- linux的博客客户端 drivel
- linux 代理 一个客户端来就创建一个连接
- linux客户端如何配置网络?
- linux socket多客户端程序
- linux下用kerberos客户端加入windows域的问题
- 求助:linux下ftp客户端代码编写
- linux怎样装那个锐杰认证客户端
- linux系统做服务器,客户端可使用windows系列的系统吗
- linux下默认的邮件客户端是什么
- linux作为客户端,跟windows通信,如何保持一直在线?
- linux中监听客户端访问tomcat的命令
- linux的twitter客户端 twitux
- linux邮件客户端 evolution
- linux下的写的tcp客户端,connect到windows的服务器超时
- linux下c/c++ boost安装及并发编程库mpi介绍
- 都说《unix环境高级编程》好,对于学linux编程好不好?《linux下的c编程》《嵌入式系统c编程》那个更适合初学者?各是那个出版社的?(
- 我想学linux编程,请大家推荐几本学习linux下c/c++编程的书
- 学linux编程前要学unix吗?哪里有学linux编程的好书下载?
- 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
- linux下编程跟平时的编程有什么区别吗?
- unix编程与linux编程有什么区别?
- linux下的编程指的就是shell编程吗?
- 帮我介绍基本linux下编程的书,《linux上的c编程》这本书怎么样?还有别的书吗?
- linux下使用openssl api编程socket编程,为什么要编译啊?
- 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
您可能感兴趣的文章:
-
本站(WWW.169IT.COM)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.169IT.COM)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
转载请注明:文章转载自:[169IT-IT技术资讯]
本文标题:linux c socket编程:简单的客户端(client)和服务端(server)实现
内容总结
以上是互联网集市为您收集整理的Linux c socket编程全部内容,希望文章能够帮你解决Linux c socket编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。