当前位置: 技术问答>linux和unix
高分请大家来谈谈socket API,来者有分
来源: 互联网 发布时间:2015-05-16
本文导语: 请大家谈谈现在socket API的缺点,对它有什么看法,有什么改进方法。大家可从各个角度谈谈,想说什么就说什么!谢谢大家的参与!!! | QoS是全网的概念,这里的QSocket是对本机的网络流量...
请大家谈谈现在socket API的缺点,对它有什么看法,有什么改进方法。大家可从各个角度谈谈,想说什么就说什么!谢谢大家的参与!!!
|
QoS是全网的概念,这里的QSocket是对本机的网络流量进行分类、调度,只是一个操作系统API接口,类似现在的setsockopt要做的事情。但如果网络设备不提供QoS能力,应用对带宽、时延、抖动、拥塞等指标的要求仍然无法满足。而且,从网络管理的角度讲,由应用指定报文的优先级是不能接受的。所以QSocket能实现的只是本机所有的网络带宽等资源在本机应用之间的分配,不能真正满足应用的需求。
|
up
|
在Unix系统中的socket api是最早由berkeley大学开发,同BSD Unix一同发行的,所以后来就称为bsd行为的socket.它的出现改变了世界:-).诞生了网络。
随之而来的就是软件开发商的模仿,如后来的win32 socket。1.1及以前的版本都被称为bsd socket。从2.0开始改变了这个bsd行为,但基本模式还是以bsd行为为基础。在功能上表面上看好像是增强了,其实本质上只是更适合于以消息驱动方式开发网络程序而已。它能实现的功能,bsd套接字都能实现,包括异步(以消息驱动)方式通信。从我个人观点认为,对于开发任何规模的网络程序,bsd socket是最好的选择,它的通信模式给人非常爽和利索的感觉,就像喜欢C语言的简洁一样。到现在为止,unix系统上,windows上的多数的主要网络开发还是由bsd socket来完成。而人们没有再开发什么网络API.这从侧面证明了,bsd socket的完美性。
有时间去写网络api,还不如踏踏实实做点事情,不要好高鹜远
随之而来的就是软件开发商的模仿,如后来的win32 socket。1.1及以前的版本都被称为bsd socket。从2.0开始改变了这个bsd行为,但基本模式还是以bsd行为为基础。在功能上表面上看好像是增强了,其实本质上只是更适合于以消息驱动方式开发网络程序而已。它能实现的功能,bsd套接字都能实现,包括异步(以消息驱动)方式通信。从我个人观点认为,对于开发任何规模的网络程序,bsd socket是最好的选择,它的通信模式给人非常爽和利索的感觉,就像喜欢C语言的简洁一样。到现在为止,unix系统上,windows上的多数的主要网络开发还是由bsd socket来完成。而人们没有再开发什么网络API.这从侧面证明了,bsd socket的完美性。
有时间去写网络api,还不如踏踏实实做点事情,不要好高鹜远
|
呵呵,学习中,俺只是写过简单的多线程并发服务器的程序.
只是用到了基本的API,对于select这样的东东都没有用过.
感觉好像有点复杂.
尤其感觉对于UDP的应用开发,似乎要很有经验才能写好.
不知道有没有可能某些高手在socket之再封装一些更好用的针对具体服务的接口呢
只是用到了基本的API,对于select这样的东东都没有用过.
感觉好像有点复杂.
尤其感觉对于UDP的应用开发,似乎要很有经验才能写好.
不知道有没有可能某些高手在socket之再封装一些更好用的针对具体服务的接口呢
|
你要重写socket API?
我感觉在写socket程序时有关ipv4和ipv6的处理很麻烦,如果老兄能把相关处理都封装
起来作一套透明支持ipv4和ipv6的API,肯定叫座!
我感觉在写socket程序时有关ipv4和ipv6的处理很麻烦,如果老兄能把相关处理都封装
起来作一套透明支持ipv4和ipv6的API,肯定叫座!
|
使用起来比较复杂,好多地方都和系统精密相关,新手入门不易,
兄弟如果有想法,不如用c++把他们的封装成像windows sock那样的 类
这样的话,入门更容易了,如果能作得足够精壮,可要提高好多人的工作效率哦,
至于其他,水平有限,没什么高见!
兄弟如果有想法,不如用c++把他们的封装成像windows sock那样的 类
这样的话,入门更容易了,如果能作得足够精壮,可要提高好多人的工作效率哦,
至于其他,水平有限,没什么高见!
|
/*
* bsocket.h - declarations/definitions for BSD socket operation
*
* Gang He - dchg2000@mail.com .
*/
#ifndef _HEGANG_BSOCKET_H_
#define _HEGANG_BSOCKET_H_
#include
#include
/*
* Redefine custom data type
*/
typedef int SOCKET;
typedef unsigned short PORT;
/*
* Define compatible macro
*/
#define INVALID_SOCKET 0
#define SOCKET_RECV_TIMEOUT -2
/*
* Create socket
*/
SOCKET create_bsocket(int domain, int type, int protocol);
/*
* Listen socket
*/
int listen_bsocket(SOCKET sock, PORT port);
/*
* Accept socket
*/
SOCKET accept_bsocket(SOCKET sock, char* ip_addr);
/*
* Connect socket
*/
int connect_bsocket(SOCKET sock, char* ip, PORT port);
/*
* Receive data from socket
*/
int recv_bsocket(SOCKET sock, void* pbuf, size_t bufsize, int timeout);
/*
* Send data to socket
*/
int send_bsocket(SOCKET sock, const void* pbuf, size_t bufsize);
/*
* Close socket
*/
void close_bsocket(SOCKET *sock);
#endif
* bsocket.h - declarations/definitions for BSD socket operation
*
* Gang He - dchg2000@mail.com .
*/
#ifndef _HEGANG_BSOCKET_H_
#define _HEGANG_BSOCKET_H_
#include
#include
/*
* Redefine custom data type
*/
typedef int SOCKET;
typedef unsigned short PORT;
/*
* Define compatible macro
*/
#define INVALID_SOCKET 0
#define SOCKET_RECV_TIMEOUT -2
/*
* Create socket
*/
SOCKET create_bsocket(int domain, int type, int protocol);
/*
* Listen socket
*/
int listen_bsocket(SOCKET sock, PORT port);
/*
* Accept socket
*/
SOCKET accept_bsocket(SOCKET sock, char* ip_addr);
/*
* Connect socket
*/
int connect_bsocket(SOCKET sock, char* ip, PORT port);
/*
* Receive data from socket
*/
int recv_bsocket(SOCKET sock, void* pbuf, size_t bufsize, int timeout);
/*
* Send data to socket
*/
int send_bsocket(SOCKET sock, const void* pbuf, size_t bufsize);
/*
* Close socket
*/
void close_bsocket(SOCKET *sock);
#endif
|
/* bsocket.c */
#include
#include
#include
#include
#include "bsocket.h"
SOCKET create_bsocket(int domain, int type, int protocol)
{
return socket(domain, type, protocol);
}
int listen_bsocket(SOCKET sock, PORT port)
{
char hostname[64];
struct hostent *hp;
struct sockaddr_in local;
int optval;
gethostname(hostname, sizeof(hostname));
if ( (hp = gethostbyname((char*)hostname)) == NULL )
return -1;
bcopy(hp->h_addr, &local.sin_addr, hp->h_length);
local.sin_port = htons(port);
optval = 1;
if ( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1 )
return -1;
if ( bind(sock, (struct sockaddr*)&local, sizeof(local)) == -1 )
return -1;
return listen(sock, 1);
}
SOCKET accept_bsocket(SOCKET sock, char* ip_addr)
{
SOCKET new_sock;
struct sockaddr_in from_addr;
int addr_len = sizeof(from_addr);
new_sock = accept(sock, (struct sockaddr*)&from_addr, &addr_len);
if ( new_sock > 0 ) {
sprintf(ip_addr, "%s", inet_ntoa(from_addr.sin_addr));
}
return new_sock;
}
int connect_bsocket(SOCKET sock, char* ip, PORT port)
{
struct sockaddr_in srvaddr;
bzero(&srvaddr, sizeof(srvaddr));
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr(ip);
srvaddr.sin_port = htons(port);
return connect(sock, (struct sockaddr*)&srvaddr, sizeof(srvaddr));
}
int send_bsocket(SOCKET sock, const void* pbuf, size_t bufsize)
{
int s_byte, b_count;
b_count = 0;
while ( b_count 0 )
tv.tv_sec = timeout;
while ( byte_rcv
#include
#include
#include
#include
#include "bsocket.h"
SOCKET create_bsocket(int domain, int type, int protocol)
{
return socket(domain, type, protocol);
}
int listen_bsocket(SOCKET sock, PORT port)
{
char hostname[64];
struct hostent *hp;
struct sockaddr_in local;
int optval;
gethostname(hostname, sizeof(hostname));
if ( (hp = gethostbyname((char*)hostname)) == NULL )
return -1;
bcopy(hp->h_addr, &local.sin_addr, hp->h_length);
local.sin_port = htons(port);
optval = 1;
if ( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1 )
return -1;
if ( bind(sock, (struct sockaddr*)&local, sizeof(local)) == -1 )
return -1;
return listen(sock, 1);
}
SOCKET accept_bsocket(SOCKET sock, char* ip_addr)
{
SOCKET new_sock;
struct sockaddr_in from_addr;
int addr_len = sizeof(from_addr);
new_sock = accept(sock, (struct sockaddr*)&from_addr, &addr_len);
if ( new_sock > 0 ) {
sprintf(ip_addr, "%s", inet_ntoa(from_addr.sin_addr));
}
return new_sock;
}
int connect_bsocket(SOCKET sock, char* ip, PORT port)
{
struct sockaddr_in srvaddr;
bzero(&srvaddr, sizeof(srvaddr));
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr(ip);
srvaddr.sin_port = htons(port);
return connect(sock, (struct sockaddr*)&srvaddr, sizeof(srvaddr));
}
int send_bsocket(SOCKET sock, const void* pbuf, size_t bufsize)
{
int s_byte, b_count;
b_count = 0;
while ( b_count 0 )
tv.tv_sec = timeout;
while ( byte_rcv