网络编程学习笔记(tcp_connect函数)
2014-10-11 21:18
447 查看
执行客户端程序的一般操作步骤,创建一个TCP套接口并与服务器建立连接,其代码如下:
#include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define MAXLINE 128 #define MAXSOCKADDR sizeof(struct sockaddr) struct addrinfo *host_serv(char *host, const char *serv, int family, int socktype) { int n; struct addrinfo hints, *res; bzero(&hints, sizeof(hints)); hints.ai_flags = AI_CANONNAME; hints.ai_family = family; hints.ai_socktype = socktype; if ((n = getaddrinfo(host, serv, &hints, &res)) != 0) return NULL; return res; } int tcp_connect(const char *hostname, const char *serv) { int sockfd, n; struct addrinfo hints, *res, *ressave; bzero(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; if ((n = getaddrinfo(hostname, serv, &hints, &res)) != 0) { printf("tcp connect error for %s, %s:%s\n", hostname, serv, gai_strerror(n)); return -1; } ressave = res; do { sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd < 0) continue; if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0) break; close(sockfd); } while ((res = res->ai_next) != NULL); if (res == NULL) { printf("tcp_connect error for %s, %s\n", hostname, serv); return -1; } freeaddrinfo(ressave); return sockfd; } char *sock_ntop(struct sockaddr *sa, socklen_t len) { char portstr[7]; static char str[MAXLINE + 1]; switch (sa->sa_family) { case AF_INET: { struct sockaddr_in *sin = (struct sockaddr_in*)sa; if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) return NULL; if (ntohs(sin->sin_port) != 0) { snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port)); strcat(str, portstr); return str; } } } return NULL; } int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; socklen_t len; struct sockaddr *sa; if (argc != 3) { printf("usage: exename <hostname/ipaddress> <service/port>\n"); return -1; } sockfd = tcp_connect(argv[1], argv[2]); if (sockfd < 0) { //printf("tcp_connect error\n"); return -1; } sa = malloc(MAXSOCKADDR); len = MAXSOCKADDR; if (getpeername(sockfd, sa, &len) < 0) { printf("getpeername error:%s\n", strerror(errno)); close(sockfd); return -1; } printf("connected to %s\n", sock_ntop(sa, len)); while ((n = read(sockfd, recvline, MAXLINE)) > 0) { recvline = 0; fputs(recvline, stdout); } return 0; }
相关文章推荐
- 19. JAVA 网络编程 Part 1 (IP与InetAddress类、URL与URLConnection类、URLEncoder与URLDecoder类、TCP&UDP)---- 学习笔记
- TCP/IP网络编程 学习笔记_1 --网络编程入门
- Linux-网络编程学习笔记之tcp
- TCP-IP学习笔记四:NIO的网络编程-多线程实例
- Java 网络编程 TCP vs UDP -Java学习笔记(31)
- 黑马程序员_学习笔记:15) 网络编程:Socket(udp、tcp)
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- Linux网络编程-学习笔记(基础TCP套接字函数)
- 黑马程序员_网络编程TCP之学习笔记
- 【网络编程学习笔记01】Socket套接字编程(TCP/IP)
- c#网络编程学习笔记02_Tcp编程(上)
- java网络编程 tcp 黑马程序员学习笔记(11)
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- TCP/IP网络编程 学习笔记_8 --优雅地断开套接字连接
- 网络编程学习笔记(udp_connect函数)
- [学习笔记]Java网络编程之TCP通讯
- 网络编程学习笔记二(实现一个基于简单TCP的用户注册程序)
- TCP-IP学习笔记三:NIO的网络编程-单线程实例
- java 网络编程 tcp黑马程序员学习笔记(4)
- Java学习笔记之网络编程(二):TCP