linux socket编程注意点 和 关闭selinux、防火墙 或者 设置相应端口允许通讯!!!

来源:互联网 发布:除了京东淘宝还有什么 编辑:程序博客网 时间:2024/05/22 01:23

在Linux系统下:

socket创建失败,返回-1。

accept等待连接失败,返回-1。


在Linux系统下:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);

有些系统包含的头文件是 <netinet/in.h> 而不是 <arpa/inet.h>.

htonl()返回一个网络字节顺序的值。将主机数转换成无符号长整型的网络字节顺序。本函数将一个32位数从主机字节顺序转换成网络字节顺序。

sctLocalAddr.sin_addr.s_addr = htonl( INADDR_ANY);

htons的功能:将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)
参数u_short hostshort:16位无符号整数
返回值:TCP/IP网络字节顺序.

sctLocalAddr.sin_port = htons((short)TCPPROTNUM);


在linux 环境下为:
#include <sys/types.h>
#include <sys/socket.h>
int bind( int sockfd , const struct sockaddr * my_addr, socklen_t addrlen);
返回:成功返回0,失败返回-1.
参数列表中,sockfd 表示已经建立的socket编号(描述符);
my_addr 是一个指向sockaddr结构体类型的指针;
参数addrlen表示my_addr结构的长度,可以用sizeof函数获得。


Linux下inet_pton和inet_ntop这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。而且,这2个函数能够处理ipv4和ipv6。算是比较新的函数了。
inet_ntop函数原型如下[将“二进制整数” -> “点分十进制”]
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和inet_pton相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,

如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC。

char addr_p[16]; /*IP地址的点分十进制字符串表示形式*/
struct in_addr addr_n;/*IP地址的二进制表示形式*/
printf("connect from %s, port:%d \n",
Inet_ntop( AF_INEF, &sctClientAddr, addr_p, (socklen_t)sizeof(addr_p)),/*地址由二进制数转换为点分十进制*/
ntohs(sctClientAddr.sin_port)

);

出错检查:
inet_pton函数成功的话返回1,参数无效返回0,错误返回-1;
inet_ntop函数成功的话返回字符串的首地址,错误返回NULL;

0 0