socket语句,socket用法

http://www.itjxue.com  2023-01-17 12:09  来源:未知  点击次数: 

Socket菜鸟上路!~ 求高手注释两条语句

SendToClient 应该是一个方法 你可以跟踪看看这个方法做什么的

EndPoint ep = client.RemoteEndPoint 就是把 client 的RemoteEndPoint 这个属性取出来啊 具体的 要看你那边实现是什么 估计是个远程对象

使用Socket进行网络编程时,首先我们需要创建一个服务器类 以下语句能够创建服务器类的是

这个源码有个错误,是这个地方 char *buff[256];是256个指针,每个指针大小为4个字节,并且指向位置不确定,buff就是指向指针的指针,而不是指向空间的。应该为char buff[256];是256个字符空间 buff就是空间的首地址,也就指针,如果不改的话Receive( buff,256);就出错了。

=(struct MEG*)buff;

就是强制类型转换,将MEG指针 指向了 buff位置,利用MEG结构分组buff指向的内容。虽然buff是256但MEG大小之外的通过MEG指针访问不到。

请求达人讲解一下下面一段socket代码

exit 结束当前进程

exit(正常结束进程)

相关函数 _exit,atexit,on_exit

表头文件 #includestdlib.h

定义函数 void exit(int status);

函数说明 exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。

返回值

如果创建socket失败,输出错误码

下面是socket的函数原型。

socket(建立一个socket通信)

相关函数 accept,bind,connect,listen

表头文件 #includesys/types.h

#includesys/socket.h

定义函数 int socket(int domain,int type,int protocol);

函数说明 socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口。参数domain 指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h 内,底下是常见的协议:

PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 进程通信协议

PF_INET?AF_INET Ipv4网络协议

PF_INET6/AF_INET6 Ipv6 网络协议

PF_IPX/AF_IPX IPX-Novell协议

PF_NETLINK/AF_NETLINK 核心用户接口装置

PF_X25/AF_X25 ITU-T X.25/ISO-8208 协议

PF_AX25/AF_AX25 业余无线AX.25协议

PF_ATMPVC/AF_ATMPVC 存取原始ATM PVCs

PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议

PF_PACKET/AF_PACKET 初级封包接口

参数 type有下列几种数值:

SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持

OOB 机制,在所有数据传送前必须使用connect()来建立连线状态。

SOCK_DGRAM 使用不连续不可信赖的数据包连接

SOCK_SEQPACKET 提供连续可信赖的数据包连接

SOCK_RAW 提供原始网络协议存取

SOCK_RDM 提供可信赖的数据包连接

SOCK_PACKET 提供和网络驱动程序直接通信。

protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可。

返回值 成功则返回socket处理代码,失败返回-1。

错误代码 EPROTONOSUPPORT 参数domain指定的类型不支持参数type或protocol指定的协议

ENFILE 核心内存不足,无法建立新的socket结构

EMFILE 进程文件表溢出,无法再建立新的socket

EACCESS 权限不足,无法建立type或protocol指定的协议

ENOBUFS/ENOMEM 内存不足

EINVAL 参数domain/type/protocol不合法

linux编程socket程序的编译语句

server端:

#include stdio.h

#include unistd.h

#include stdlib.h

#includestring.h

#include ctype.h

#include sys/socket.h

#include arpa/inet.h

#define MAX_LINE 100

int main()

{

struct sockaddr_in server;

struct sockaddr_in client;

int server_fd;

int client_fd;

socklen_t len;

char buf[MAX_LINE]; //用于存储传送内容到缓冲区

char addr_ip[INET_ADDRSTRLEN];//存储客户端地址缓冲区

int port = 8000;//端口号8000

int n; //读写字节数

bzero(server,sizeof(server));//清空地址结构

server.sin_family = AF_INET;//使用ipv4

server.sin_addr.s_addr = INADDR_ANY;//服务器可以接受任意地址

server.sin_port = htons(port);//把端口号转成网络字节序

server_fd = socket(AF_INET,SOCK_STREAM,0);//创立套接字,使用tcp协议

bind(server_fd,(struct sockaddr *)server,sizeof(server));//将地址和套接字绑定

listen(server_fd,10);//开始监听

printf("waiting```\n");

while(1)

{

client_fd = accept(server_fd,(struct sockaddr *)client,len);

n = read(client_fd,buf,MAX_LINE);//读取客户端来的消息

inet_ntop(AF_INET,client.sin_addr,addr_ip,sizeof(addr_ip));

printf("client ip is : %s , port is : %d\n",addr_ip,ntohs(client.sin_port));

printf("content is : %s\n",buf);//打印客户端信息

write(client_fd,buf,n);//转发回去给客户端

close(client_fd);

}

if(close(client_fd) == -1)

{

perror("fail to close");

exit(1);

}

return 0;

}

client端:

#include stdio.h

#include stdlib.h

#include string.h

#include unistd.h

#include sys/types.h

#include sys/socket.h

#include arpa/inet.h

#define MAX_LINE 100

int main(int argc,char * argv[])

{

struct sockaddr_in server;//服务器地址

char buf[MAX_LINE];

int server_fd;

int port = 8000;

char *str = "test string";//默认字符串

if(argc 1)

{

str = argv[1];//从命令参数中取得用户输入的串

}

bzero(server,sizeof(server));//清空地址结构

server.sin_family = AF_INET;//使用ipv4

inet_pton(AF_INET,"192.168.228.129",server.sin_addr);

server.sin_port = htons(port);

server_fd = socket(AF_INET,SOCK_STREAM,0);//创建套接字

connect(server_fd,(struct sockaddr *)server,sizeof(server));

write(server_fd,str,strlen(str) + 1);

//因为是本机测试,所以不用考虑延时

read(server_fd,buf,MAX_LINE);

printf("recieve from server :%s\n",buf);

close(server_fd);

return 0;

}

//源码来自于网络,谁写也都类似,都是基于tcp的三次握手协议来写的

java 中的socket 是不是从哪个端口发出客户端请求就从这个端口接收数据

一、建立服务器类

Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。

ServerSocket server = new ServerSocket(9998)

这条语句创建了一个服务器对象,这个服务器使用9998号端口即在端口9998上注册服务,这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。

Socket incoming = server.accept() ; // 监听窗口,等待连接

进而得到输入流和输出流,并进行封装

BufferedReader in = new BufferedReader(new

InputStreamReader(incoming.getInputStream()));

/*

当读取文件时,先把内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。

*/

PrintWriter ut = new PrintWriter(incoming.getOutputStream(),true);

随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用

out.close();

in.close();

二、建立客户端代码

相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。

Socket socket = new Socket("168.160.12.42",9998);

或:

Socket socket = new Socket(InetAddress.getLocalHost(),5678); // 向主机名为InetAddress.getLocalHost()的服务器申请连接

客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(socket.getOutputStream(),true);

以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为168.160.12.42的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。

下面正确的创建Socket的语句有

C

因为SOCKET创建只有服务端需要IP和端口,客户端不需要指定。

(责任编辑:IT教学网)

更多