如何用C语言实现Socket

EXIT_ON_CLOSE 2008-12-25 04:47:09
希望大家讲解一下Socket的原理,并推荐一些这方面的书籍,有代码更好,不胜感激.
...全文
2260 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZCX880915 2011-09-22
  • 打赏
  • 举报
回复
[
b][/b]
sxq1714 2011-05-10
  • 打赏
  • 举报
回复
sxq1714@126c.om
wangzhiliang214 2010-05-12
  • 打赏
  • 举报
回复
我也想要 行吗 谢谢了 mingyun0227@126.com
shawn 2010-04-07
  • 打赏
  • 举报
回复
cxwshawn@yeah.net
可以的话也给我发个例子吧 。。。感谢。。。
johnelf 2009-05-17
  • 打赏
  • 举报
回复
up
orchisan 2009-03-16
  • 打赏
  • 举报
回复
orchisan@163.com
可以的话,12楼的也给我发几个例子吧,非常感谢!
lvjaio5241 2008-12-27
  • 打赏
  • 举报
回复
学习
ypb362148418 2008-12-27
  • 打赏
  • 举报
回复
支持9楼的同志,应该要基于TCP协议的,因为UDP不安全,建议你去搜搜
EXIT_ON_CLOSE 2008-12-27
  • 打赏
  • 举报
回复
最好是基于UDP的列子,谢谢。
EXIT_ON_CLOSE 2008-12-27
  • 打赏
  • 举报
回复
我的邮箱:lqtiger8610@tiger@126.com
可以的话,12楼的给我发几个例子吧,非常感谢!
沙漠里的海豚 2008-12-26
  • 打赏
  • 举报
回复
这个有很多啊,需要的话可以给你发个例子
neu_dfh 2008-12-26
  • 打赏
  • 举报
回复
我是9楼的,继续写


服务端主要是这几步
socketID = socket(AF_INET, SOCK_STREAM, 0)
创建套接字
bind(socketID, (struct sockaddr *)&stServerAddr, sizeof(stServerAddr);
把服务端地址和套接字绑定。
listen(socketID, Num);Num规定不大于5,一般就写成5
这是监听套接字有无客户端的连接请求,队列允许5个
clientsocket = accept(socketID, (struct sockaddr *)&stAddr, &len);
如果有客户端的请求,函数返回连接的客户端套接字。如果没有继续判断,这里应该是一个循环。
send(clientsocket, buff, siBuffLen, MSG_WAITALL);
向客户端发送buf里的数据
Client的步骤
clientsocket = socket()建立客户端的套接字
connect(clientsocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
向服务端提出申请。
recv(clientsocket, buff, siBuffLen, MSG_WAITALL)
把接收的数据放到buff里。
gccdy 2008-12-26
  • 打赏
  • 举报
回复
http://dniit.download.csdn.net
去这下"C++网络编程基础"
neu_dfh 2008-12-26
  • 打赏
  • 举报
回复
http://www.chinaunix.net/jh/4/198859.html

以下自己总结的,还没总结完
把总结过的贴出来了。
1. SOCKET PASCAL FAR socket(int af, int type, int protocol)
建立套接字
该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type 描述要建立的套接字的类型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元。
Type 三种类型
流式套接字(SOCK_STREAM)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。
数据报式套接字(SOCK_DGRAM)
提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,
数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。
原始式套接字(SOCK_RAW)
该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。
封装好的函数 socket(,AF_INET , SOCK_STREAM ,0)
2. int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen)
参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name 是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。
如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。
地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。例如,UNIX BSD有一组描述套接字地址的数据结构,其中使用TCP/IP协议的地址结构为:
struct sockaddr_in{
short sin_family; /*AF_INET*/
u_short sin_port; /*16位端口号,网络字节顺序*/
struct in_addr sin_addr; /*32位IP地址,网络字节顺序*/
char sin_zero[8]; /*保留*/
}

struct sockaddr_in ServerAddr;
bzero((void*)&ServerAddr,sizeof(ServerAddr));
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
ServerAddr.sin_port=htons(Port);

bind(SocketID, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr));
3. int PASCAL FAR setsockopt( SOCKET s, int level, int optname,const char FAR* optval, int optlen);

s:标识一个套接口的描述字。
level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。
optname:需设置的选项。
optval:指针,指向存放选项值的缓冲区。
optlen:optval缓冲区的长度。
4. int PASCAL FAR listen(SOCKET s, int backlog);
此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:
参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。

listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。

调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。
EXIT_ON_CLOSE 2008-12-26
  • 打赏
  • 举报
回复
基于UDP的Socket原理,请各位也推荐一下这方面的书籍和网上资源.
zhan1094 2008-12-25
  • 打赏
  • 举报
回复
《linux下的网络编程》
zhousqy 2008-12-25
  • 打赏
  • 举报
回复
看《unix网络编程》吧
submarine2007 2008-12-25
  • 打赏
  • 举报
回复
TCP/IP详解第二卷讲网络实现的
syd_programming 2008-12-25
  • 打赏
  • 举报
回复
可以看看《TCP/IP详解》
51365133 2008-12-25
  • 打赏
  • 举报
回复
去看看UNIX下的Socket,基本差不多。buidu google下。
加载更多回复(2)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧