linux socket系统调用的错误码及含义

linux socket系统调用socket,accept,bind,listen,connect,send,recv等函数出错时,errno的值及其含义对应如下:

EAGAIN: Resource temporarily unavailable
EWOULDBLOCK: Resource temporarily unavailable
EBADF: Bad file descriptor
ECONNREFUSED: Connection refused
EFAULT: Bad address
EINTR: Interrupted system call
EINVAL: Invalid argument
ENOMEM: Cannot allocate memory
ENOTCONN: Transport endpoint is not connected
ENOTSOCK: Socket operation on non-socket
EACCES: Permission denied
ECONNRESET: Connection reset by peer
EDESTADDRREQ: Destination address required
EMSGSIZE: Message too long
ENOBUFS: No buffer space available
EOPNOTSUPP: Operation not supported
EPIPE: Broken pipe
EPERM: Operation not permitted
EADDRINUSE: Address already in use
EAFNOSUPPORT: Address family not supported by protocol
EALREADY: Operation already in progress
EINPROGRESS: Operation now in progress
EISCONN: Transport endpoint is already connected
ENETUNREACH: Network is unreachable
ETIMEDOUT: Connection timed out
EMFILE: Too many open files
ENFILE: Too many open files in system
EPROTO: Protocol error
EADDRINUSE: Address already in use
EADDRNOTAVAIL: Cannot assign requested address
ELOOP: Too many levels of symbolic links
ENAMETOOLONG: File name too long
ENOENT: No such file or directory
ENOTDIR: Not a directory
EROFS: Read-only file system
EPROTONOSUPPORT: Protocol not supported

测试代码如下:


void print_sock_errors() {
	int i;
#define _ITEM(i)  {i, #i}
	struct sock_error {
		int error;
		char str[32];
	} errors[] = {
			_ITEM(EAGAIN),
			_ITEM(EWOULDBLOCK),
			_ITEM(EBADF),
			_ITEM(ECONNREFUSED),
			_ITEM(EFAULT),
			_ITEM(EINTR),
			_ITEM(EINVAL),
			_ITEM(ENOMEM),
			_ITEM(ENOTCONN),
			_ITEM(ENOTSOCK),
			_ITEM(EACCES),
			_ITEM(ECONNRESET),
			_ITEM(EDESTADDRREQ),
			_ITEM(EMSGSIZE),
			_ITEM(ENOBUFS),
			_ITEM(EOPNOTSUPP),
			_ITEM(EPIPE),
			_ITEM(EPERM),
			_ITEM(EADDRINUSE),
			_ITEM(EAFNOSUPPORT),
			_ITEM(EALREADY),
			_ITEM(EINPROGRESS),
			_ITEM(EISCONN),
			_ITEM(ENETUNREACH),
			_ITEM(ETIMEDOUT),
			_ITEM(EMFILE),		//accept
			_ITEM(ENFILE),		//accept
			_ITEM(EPROTO),
			_ITEM(EADDRINUSE),
			_ITEM(EADDRNOTAVAIL),	//bind
			_ITEM(ELOOP),			//bind
			_ITEM(ENAMETOOLONG),	//bind
			_ITEM(ENOENT),			//bind
			_ITEM(ENOTDIR),			//bind
			_ITEM(EROFS),			//bind
			_ITEM(EPROTONOSUPPORT),	//socket
		};

	for(i = 0; i < sizeof(errors) / sizeof(errors[0]); i ++) {
		errno = errors[i].error;
		perror(errors[i].str);
	}

	printf("\n\n");
}
发表在 C | 留下评论

non-block socket相关错误

建立socket后,如果socket被设置为non-block,在后续的调用中,需要注意一些情况。

由于non-block模式下,connect,recv,send都会在资源没有就绪的情况下,立刻返回,因此,需要判断是什么原因返回的。

connect:如果non-block是,connect可能会返回“Operation now in progress”,对应的errno为EINPROGRESS,表示socket已经在连接,这种情况下,需要等一段时间,观察connect是否已经就绪;解决方法可参考

http://1.guotie.sinaapp.com/?p=235

recv:在non-block的情况下,会返回“Resource temporarily unavailable”类型的错误,对应的ernno为EAGAIN,这时,只需重新进入循环recv即可;

send与recv类似。

Connection reset by peer: 如果对端socket没有调用close,而进程直接退出的话,系统会发送reset报文。

 

发表在 C | 标签为 , , | 留下评论

sae storage(1)

sae storage是sina云平台用来储存数据的接口。

storage的python api文档很简单,在这里:http://appstack.sinaapp.com/static/doc/release/testing/service.html#storage,只能通过实践测试来搞定。

先说一下list接口。

list接口用来返回storage下的所有objects,原型如下:

objects = list(‘storage-name’)

list返回一个list结构体,里面的每一个object是一个字典dict,这个字典有这些字段,举例如下:

{u’length’: 27113, u’datetime’: 1336723940, ‘name’: u’ascii-1.gif’}

值得说明的是,storage下可以有目录,但api却没有给出如何创建目录的接口。

如果object是一个目录,它的name后面有一段标识:/__________sae-dir-tag,举例如下:

{u’length’: 26, u’datetime’: 1336723920, ‘name’: u’001/__________sae-dir-tag’}

 

 

发表在 sae, 未分类 | 标签为 , | 留下评论

百度开放云平台

您好:
由于百度开放云平台目前仍处于公测阶段,对于开发者的使用有一定的限制。通过对您提交的信息的认真审核,很遗憾的通知您,暂时不开放给个人开发者,还无法为您开通百度开放云平台的相关权限。
欢迎您在正式开放后,再来体验百度的云服务。
感谢您对百度开放云平台的关注。
不过,百度开发云存储看上去真的挺诱人的。
发表在 互联网 | 留下评论

牛人都是工作狂?!

爱因斯坦曾说,天才是由1分的灵感和99分的汗水,而这1分的灵感是最重要的。

国内的教育把后面半句给阉割了,来强调99分汗水的重要性。

不管怎么样,99分的汗水确实很重要,今天看了facebook的中国雇员王淮的blog,感受更深。

他说他在facebook平均每周的工作时间是60小时。

blog原文在这里:http://blog.sina.com.cn/s/blog_70c9335b01014jiu.html

都不容易啊!

 

 

 

 

 

 

 

发表在 人生 | 留下评论

socket,accept,connect出现EINTR错误的解决方法

建立套接字的主要的几个函数无非就是socket,accept,connect,bind等系统调用,有时候,一些系统调用,如accept,connect,recv,send会返回EINTR错误,对这种错误,需要怎么来处理,是一个很重要的细节问题。 继续阅读

发表在 C, Linux | 一条评论

几个很cool的玩意

1、phantomJS

这是一个js框架,实现一个headless browser。什么是headless browser?就是没有UI界面的browser,这样可以让你的程序在后台调用这个类库,获取你想得到的东西。

 

2、PhoneGap

这玩意很好,使用html5,css,javascript就可以开发出iOS,Android应用了。

 

最近有一个感触,javascript越来越火了。

 

发表在 互联网 | 留下评论

pthread_spinlock_t

pthread_spinlock_t其实是一个volatile int,定义在pthreadtypes.h中:
find /usr/include -exec grep -nH pthread_spinlock_t {} \;

/usr/include/bits/pthreadtypes.h:201:typedef volatile int pthread_spinlock_t;

继续阅读

发表在 C, Linux | 留下评论

ldconfig & ldd

今天在使用redis的的C库hiredis时,遇到一个小问题,折腾了半天。

大概是这样的,编译安装hiredis,make PREFIX=/usr install,然后,编译我的代码,都没有问题,但是,启动编译后的应用程序时,报错:

error while loading shared libraries: libhiredis.so.0.10: cannot open shared object file: No such file or directory

在网上查了一下,需要更新一下库的cache,执行命令:

ldconfig /usr/lib/

查了一下ldconfig的帮助,是这么说的:

ldconfig  creates  the  necessary links and cache to the most recent shared libraries
found in the directories specified on the command line, in the file /etc/ld.so.conf, and
in the trusted directories (/lib and /usr/lib).  The cache is
used by the run-time linker, ld.so or ld-linux.so.  ldconfig checks the header and filenames
of the libraries it encounters when determining which versions should have their links
updated.

我的理解是这样的:

由于/etc/ld.so.cache没更新,而程序启动时,会去/etc/ld.so.cache来查找所要用的库,所以出现一开始的错误。

 

 

发表在 C, Linux | 留下评论

amazon的sns access control

基本上amazon的access control是基于acl的,详见这里:
http://docs.amazonwebservices.com/sns/latest/gsg/AccessPolicyLanguage_Concepts.html 

发表在 互联网 | 标签为 | 留下评论