socket编程的细节问题

原创 2013年12月04日 09:03:39

What is the difference between AF_INET and PF_INET in socket programming?

In some documentation, you'll see mention of a mystical "PF_INET". This is a weird etherial beast that is rarely seen in nature, but I might as well clarify it a bit here. Once a long time ago, it was thought that maybe a address family (what the "AF" in "AF_INET" stands for) might support several protocols that were referenced by their protocol family (what the "PF" in "PF_INET" stands for).
That didn't happen. Oh well. So the correct thing to do is to use AF_INET in your struct sockaddr_in and PF_INET in your call to socket(). But practically speaking, you can use AF_INET everywhere. And, since that's what W. Richard Stevens does in his book, that's what I'll do here.

linux客户端Socket非阻塞connect编程

You have a non-blocking socket and you are calling connect() in it. Since connect() needs the 3-way handshake to happen (so a network roundtrip), it either blocks waiting for the SYN-ACK in blocking sockets, or gives you some indication that it hasn't succeded yet in non-blocking sockets. Normally, non-blocking sockets return EAGAIN/EWOULDBLOCK to tell you that they couldn't progress and you should try again: this is not exactly your case, connect() returns EAGAIN/EWOULDBLOCK when there are no free ephemeral ports to tell you that you should try again later; so there is another error for non-blocking connect: EINPROGRESS, which tells you that the operation is in progress and you should check its status later.

To check the status later, the socket will become ready for writability, so you can useselect()/poll()/... to test for that, after which you'll have to getsockopt(...SO_ERROR...)to get the success/failure status of your connect() operation.

int tcp_connect(const char *addr, int port, int timeout)
{
	int fd, error, tmp;
	unsigned int len;
	struct sockaddr_in sa_in;
	struct timeval tv;
	fd_set fds;

	if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
		return -1;
	bzero(&sa_in, sizeof(sa_in));
	sa_in.sin_family = AF_INET;
	sa_in.sin_port = htons(port);
	sa_in.sin_addr.s_addr = inet_addr(addr);
	set_nonblocking(fd, 1);
	PRINTF("Connect IP: %s PORT: %d(tcp_client)\n", addr, port, timeout);
	tmp = connect(fd, (struct sockaddr *)&sa_in, sizeof(sa_in));
	if (tmp < 0) {
		error = errno;
		if (error != EINTR && error != EINPROGRESS) {
			close(fd);
			PRINTF("Connect fail reason:%s(tcp_client)\n",
			    strerror(error));
			return -1;
		}
	}
	while (timeout > 0) {
		tv.tv_sec = 0;
		tv.tv_usec = 0;
		FD_ZERO(&fds);
		FD_SET(fd, &fds);
		tmp = select(fd + 1, NULL, &fds, NULL, &tv);
		if (tmp > 0) {
			len = sizeof(error);
			if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0
				|| error) {
				close(fd);
				PRINTF("Connect fail reason:%s(tcp_client)\n",
					strerror(error));
				return -1;
			}
			else {
				set_nonblocking(fd, 0);
				PRINTF("Connect ok, fd is %d\n", fd);
				return fd;
			}
		}
		else if (tmp < 0) {
			error = errno;
			if (error != EINTR && error != EINPROGRESS) {
				close(fd);
				PRINTF("Connect fail, reason:%s(tcp_client)\n",
					strerror(error));
				return -1;
			}
		}
		msleep(100);
		timeout -= 100;
	}
	close(fd);
	PRINTF("Connect timeout(tcp_client)\n");
	return -1;
}


socket原理详解

我们知道进程通信的方法有管道、命名管道、信号、消息队列、共享内存、信号量,这些方法都要求通信的两个进程位于同一个主机。但是如果通信双方不在同一个主机又该如何进行通信呢?在计算机网络中我们就学过了tcp...
  • farmwang
  • farmwang
  • 2017年03月23日 20:22
  • 712

socket编程中常见问题--《一》

1) 在socket有自动重连机制的时候,如果在一个线程中实现socket错误或断线自动重连时,注意将socket设置为非阻塞的,不然当程序退出时,线程可能阻塞在connect函数,造成程序不能及时退...
  • smilestone322
  • smilestone322
  • 2013年02月28日 21:04
  • 1481

【Java TCP/IP Socket】深入剖析socket——数据传输的底层实现

转载请注明出处:     底层数据结构     如果不理解套接字的具体实现所关联的数据结构和底层协议的工作细节,就很难抓住网络编程的精妙之处,对于TCP套接字来说,更是如此。套接字所关联的底层的数...
  • mmc_maodun
  • mmc_maodun
  • 2013年11月15日 09:02
  • 17874

Android开发之Socket编程以及注意事项

注意:以下文字部分为转载部分,程序部分为原创。 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年03月23日 10:54
  • 11196

linux socket编程细节

Q: 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思? A: 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用端口。如...
  • zxygww
  • zxygww
  • 2013年10月31日 14:39
  • 880

Java编程代码优化小细节

1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过...
  • lipei1220
  • lipei1220
  • 2014年02月10日 16:19
  • 1069

JAVA经典及细节总结

写代码: 1,明确需求。我要做什么?    分析的时候:从具体到抽象 2,分析思路。我要怎么做?1,2,3。 实现的时候:从抽象到具体 3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。 ...
  • sinat_24196195
  • sinat_24196195
  • 2015年11月12日 21:39
  • 1324

codeblocks网络编程不识别socket等

转载自http://www.sjsjw.com/kf_code/article/033253ABA018712.asp 在使用CodeBlocks编译C++程序时,  编译程序的时候出现如...
  • buaa1214wwj
  • buaa1214wwj
  • 2016年07月26日 11:07
  • 1691

常见的网络编程面试题

1:tcp和udp的区别 TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,因此不会出现丢失或乱序。 UDP:是无连接的数据报服务,不对数据报进行检查与修改,...
  • weiyuefei
  • weiyuefei
  • 2015年12月27日 18:57
  • 9107

Socket原理与编程基础

 一、Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。 几个定义: (1)IP地址:即依照TCP/IP协议分...
  • amberman
  • amberman
  • 2016年05月27日 18:48
  • 903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket编程的细节问题
举报原因:
原因补充:

(最多只允许输入30个字)