linux下socket编程中close()函数??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下socket编程中close()函数??相关的知识,希望对你有一定的参考价值。

在socket编程中 建立一个描述符socket_fd
close(socket_fd);后 该描述符所对应的结构体的内容是否也一起被释放。
如果没有被释放 那我可不可以重新把该描述符的值(close前把值已经用变量保存起来了)赋值给 socket_fd继续使用???
望大虾们 帮帮忙?
那可不可以这样呢:
int socket_fd = socket(..);
int socket_x = socket_fd;
close(socket_fd);
int socket_fd2 = socket(..);
socket_fd2 = socket_x;
再使用socket_fd2会出现什么问题
如果这样会出现什么样的问题..?

那我想在一个主进程里建立多个socket如:
int socket1 = socket(..);
int socket2 = socket(..);
int socket3 = socket(..);
为了程序的需要会关闭其中几个socket
然后再进行连接
如:
close (socket1);
close (socket2);
然后再颠倒顺序重新建立:
socket2 = socket();
socket1 = socket();
但是发现 新建立的两个socket描述的值符居然相同:
这是怎么回事??
哪位大虾 给说说..

参考技术A 不可以,调用close后底层会四次握手,连接中断,句柄已经不可用了本回答被提问者采纳 参考技术B 只要不用close或fclose,不管把这个socket_fd值存到哪里,都可以使用。比如:
int socket_fd = socket(...);
int socket_x = socket_fd;
那么send(socket_x)和send(socket_fd)结果完全一致
参考技术C 你已经close了为什么还要使用它呢?如果还需要使用这个连接,就不要close等用完了,退出的时候再把它关闭。 参考技术D 一、基本socket函数
Linux系统是通过提供套接字(socket)来进行网络编程的。网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也有一个类似于打
开文件的函数:socket(),调用socket(),该函数返回一个整型的socket的描述符,随后的连接建立、数据传输等操作也都是通过该socket实现。
1、socket函数
syntax:
int socket(int domain, int type, int protocol);
功能说明:
调用成功,返回socket文件描述符;失败,返回-1,并设置errno
参数说明:
  domain指明所使用的协议族,通常为PF_INET,表示TCP/IP协议;
  type参数指定socket的类型,基本上有三种:数据流套接字、数据报套接字、原始套接字
  protocol通常赋值"0"。
  两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。socket数据结构中包含这五种信息。
2、bind函数
syntax:
int bind(int sock_fd,struct sockaddr_in *my_addr, int addrlen);
功能说明:
将套接字和指定的端口相连。成功返回0,否则,返回-1,并置errno.
第5个回答  2011-01-14 RW

Windows Socket和Linux Socket编程有什么区别

1)头文件 
Windows下winsock.h/winsock2.h 
Linux下sys/socket.h 
错误处理:errno.h

2)初始化 
Windows下需要用WSAStartup 
Linux下不需要

3)关闭socket 
 

Windows下closesocket(...) 
Linux下close(...)

4)类型 
Windows下SOCKET 
Linux下int 
如我用到的一些宏: 
#ifdef WIN32 
typedef int socklen_t; 
typedef int ssize_t; 
#endif

#ifdef __Linux__ 
typedef int SOCKET; 
typedef unsigned char BYTE; 
typedef unsigned long DWORD; 
#define FALSE 0 
#define SOCKET_ERROR (-1) 
#endif

5)获取错误码 
Windows下getlasterror()/WSAGetLastError() 
Linux下errno变量

6)设置非阻塞 
Windows下ioctlsocket() 
Linux下fcntl() <fcntl.h>

7)send函数最后一个参数 
Windows下一般设置为0 
Linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。

8)毫秒级时间获取 
Windows下GetTickCount() 
Linux下gettimeofday()

3、多线程 
多线程: (win)process.h --〉(Linux)pthread.h 
_beginthread --> pthread_create 
_endthread --> pthread_exit

 

一、linux下的socket编程:

1、客户端执行步骤依次如下:

socket()

connect()

send()或者recv()

close()

注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().

2、服务器端:

socket()

bind()

listen()

accpet()

recv()或者send()

close()

(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)

二、windows下的网络编程:

做过windows网络编程的人都知道,微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。即windows既提供上层的网络API函数也提供底层的API函数。

1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:

客户端:

obj.Create()

obj.Connect()

obj.Receive()或者obj.Send()

obj.Close()

服务器端:

先调用AfxSocketInit()检测协议栈安装情况

obj.Create()

obj.Listen()

obj.Accpet()

obj.Receive()或者obj.Send()

obj.Close()

2、对于采用底层的API函数而言,步骤如下:

客户端:

WSAStartup()

socket()

connect()

send()或者recv()

closesocket()

服务器端:

WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()

(ps:windows下CSocket类为同步方式,有阻塞现象;CASyncSocket为异步方式,无阻塞现象。)

通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:

区别一:windows下需加上WSAStartup()函数

区别二:关闭socket:linux为close(),windows为closesocket()

windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类

这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。

 

原文:http://www.linuxidc.com/Linux/2011-03/33324p2.htm







































以上是关于linux下socket编程中close()函数??的主要内容,如果未能解决你的问题,请参考以下文章

socket 编程 : shutdown vs close

linux网络编程-socket

Linux网络编程基础API

Linux网络编程基础API

Linux网络编程基础API

socket编程在windows和linux下的区别是啥?