地址转换函数:
1.将字符串的IP地址转换成网络字节序的地址
- in_addr_t inet_addr(const char *strIP);
- 若成功,返回32位网络字节序的地址,若出错,则返回INADDR_NONE 不建议使用,因为255.255.255.255这个地址无法被转换
- int inet_aton(const char *strIP, struct in_addr *addr);
- 若成功,返回非0,若地址字符串有错,返回0,仅转换IPV4地址
- int inet_pton(int family, const char *strptr, void *addrptr);
- 返回:1成功,0-输入不是有效的表达式,-1出错 Family:AF_INET6,AF_INET
- 2.将网络字节序的地址转换成字符串的IP地址
- char *inet_ntoa(struct in_addr inaddr);
- 返回:指向字符串IP的指针。非线程安全,在多线程时避免使用 例:char *ip = inet_ntoa(addr.sin_addr);
- const char *inet_ntop(int family, const void *addr, char *strIP, size_t len);
- 参数:family – 地址族,值为AF_INET或AF_INET6 addr – 需要转换的地址 返回:指向字符串IP的指针,失败返回NULL; 例:char ip[64]; inet_ntop(AF_INET, &addr.sin_addr, ip, 64);、
- 创建套接字
- 1. socket() int socket(int family, int type, int protocol);
- 功能描述:创建套接字文件描述字。 参数:family – 协议族(网络层) PF_INET -------- IPV4协议 PF_INET6-------- IPV6协议
- PF_LOCAL-------- UNIX域协议(PF_LOCAL) PF_ROUTE------- 路由套接口 type – 套接字类型 SOCK_STREAM -------- 字节流套接口(TCP及AC_LOCAL时) SOCK_DGRAM --------- 数据报套接口(UDP及AC_LOCAL时) protocol – 取0 返回:成功为非负描述字,失败返回-1 例子:int fd = socket(PF_INET, SOCK_STREAM, 0);
- 2. connect()
- int connect(int sock, const struct sockaddr *addr, socklen_t len);
功能描述:建立从客户端到服务器的连接 返回:成功返回0,失败返回-1
- 3 recv() int recv(int sock, void *buf, int size, int flag);
- 功能描述:从sock套接字接收数据。服务器使用其接收客户请求,客户使用它接受服务器的应答。如果没有数据,将阻塞。也可以使用recv接收面向连接的UDP的报文。
- 参数 sockfd:套接字描述符 buf:指向内存块的指针 size:内存块大小,以字节为单位 flags:一般为0 返回: >0 接收到的字节个数 -1 接收失败(EAGAIN-套接字非阻塞, EINTR表示被信号中断) 0 对方连接已关闭,说明套接字已经不可用,需要重新建立连接
- 4 send() ssize_t send(int sock, const void *buf, size_t len, int flags);
- 功能 在TCP连接上发送数据,返回成功传送数据的长度,出错时返回-1。 send会将外发数据复制到OS内核中,也可以使用send发送面向连接的UDP报文。
- 参数说明: sock:套接字描述符 data:指向要发送数据的指针 data_len:数据长度 flags:一直为0
- 5 close() int close(int s); 功能 关闭套接字。
- 参数说明: s – 要关闭的套接字
- connect程序
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <sys/socket.h> 4 #include <netinet/in.h> 5 #include <arpa/inet.h> 6 #include <pthread.h> 7 8 int main() 9 { 10 int sock,size; 11 uint16_t port = 8000; 12 const char *IP = "192.168.7.118"; 13 char buf[1024] = "songlongfei"; 14 struct sockaddr_in addr; 15 memset(&addr,0,sizeof(addr)); 16 sock = socket(AF_INET,SOCK_STREAM,0); 17 addr.sin_family = AF_INET; 18 addr.sin_port = htons(port); 19 inet_pton(AF_INET,IP,&addr.sin_addr); 20 if(connect(sock,(struct sockaddr*)&addr,sizeof(addr)) != 0) 21 printf("Connect failed\n"); 22 while(1) 23 { 24 fgets(buf,sizeof(buf),stdin); 25 if((size = send(sock,buf,sizeof(buf),0)) < 0) 26 printf("send failed\n"); 27 else 28 printf("Connect succ!\n"); 29 recv(sock,buf,sizeof(buf),0); 30 printf("%s\n",buf); 31 } 32 close(sock); 33 }
时间: 2024-11-02 13:54:50