导航:首页 > 编程语言 > 简单的socket程序

简单的socket程序

发布时间:2025-07-21 23:46:09

1. mfc socket 编程的流程是怎么样的

初始化socket
首先需要调用AfxSocketInit()函数来初始化我们的socket环境。
为了初始化sockets,我们需要调用AfxSocketInit()函数。它通常是在MFC中的InitInstance()函数中被调用的。如果我们用程序向导来创建socket程序的话,查看“use Windows Sockets”这个选项,然后选中它。它将会自动的为我们创建这个步骤了。(如果我们没有选中这个选项的话,我们也可以手动添加这些代码的。)这个函数的返回值显示这个函数的调用成功或失败。
BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)
{
AfxMessageBox("Sockets Could Not Be Initialized");
return FALSE;
}
...
}
创建Server Sockets
为了创建一个Server Socket,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
创建Client Sockets
为了创建Client socket类,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
m_sConnected.Create();
m_sConnected.Connect("server ip",port);
监听客户端的连接
创建了server socket以后,我们要进行监听。调用Listen()函数。这个函数的返回值显示这个函数的调用成功或失败。
if( m_sListener.Listen()== FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
接受连接
连接请求要被接受accept,是用另外的socket,不是正在监听的socket。请参看代码。
void CXXXDlg::OnAccept()
{
CString strIP;
UINT port;
if(m_sListener.Accept(m_sConnected))
{
m_sConnected.GetSockName(strIP,port); //应该是GetPeerName,获取对方的IP和port
m_status="Client Connected,IP :"+ strIP;
m_sConnected.Send("Connected To Server",strlen("Connected To Server"));
UpdateData(FALSE);
}
else
{
AfxMessageBox("Cannoot Accept Connection");
}
}
发送数据
数据放在一个buffer中或是结构体中,调用send()函数发送。
m_sConnected.Send(pBuf,iLen);
接受数据
调用receive()接受数据。
void CXXXrDlg::OnReceive()
{
char *pBuf =new char [1025];
CString strData;
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);
if(iLen == SOCKET_ERROR)
{
AfxMessageBox("Could not Recieve");
}
else
{
pBuf[iLen]=NULL;
strData=pBuf;
m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
//display in server
UpdateData(FALSE);
m_sConnected.Send(pBuf,iLen); //send the data back to the Client
delete pBuf;
}
}
关闭连接
m_sConnected.ShutDown(0); 停止发送数据
m_sConnected.ShutDown(1); 停止接受数据
m_sConnected.ShutDown(2); 停止发送接受数据
m_sConnected.Close();
编写自己的socket类
在class view中选择添加一个新类,设置它的基类为CAsyncSocket,在类向导的帮助下添加如下的一些函数。
class MySocket : public CAsyncSocket
{ // Attributes
public:
// Operations
public:
MySocket();
virtual ~MySocket();
// Overrides
public:
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySocket)
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(MySocket)
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
protected:
private:
CDialog * m_pDlg;
};
设置“Parent Dialog”
调用这个socket类的SetParentDlg函数,保证当socket事件发生的时候这个窗体能接收到。
m_sListener.SetParentDlg(this);
m_sConnected.SetParentDlg(this);
建立Socket 事件和窗体成员函数之间的联系
在这个窗体类中添加一些函数,比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它们会在我们编写的的socket类中调用到。
void MySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode==0)
{
((CServerDlg*)m_pDlg)->OnAccept();
}
CAsyncSocket::OnAccept(nErrorCode);
}

2. 求教编程做出一个两人多人之间简单的聊天程序

制作人: CK.y ,汇成建筑企业管理Q:610089144
仅供参考,大家要学会自己制作,很有成就感的啊!! 用 java 作后台,开发一个 C / S 架构的多人聊天程序。首先,设计用户界面。

一、界面设计

界面的元件全部使用 Flash CS3 自带的组件:
首先,放入 TextInput 组件(实例名 input_txt),作为用户输入;
再放入 Button 组件(实例名 submit_btn),用于提交输入的信息;
最后放入 TextArea 组件(实例名 output_txt),显示聊天信息。

二、组件参数初始化
由于客户端代码不是很多,我们这次就写在动作帧上:
// ************ 组件参数初始化 ************
submit_btn.label = "发送消息";
output_txt.editable = false;

// 设置各组件中字体的大小
input_txt.setStyle("textFormat", new TextFormat(null, 15));
output_txt.setStyle("textFormat", new TextFormat(null, 15));
submit_btn.setStyle("textFormat", new TextFormat(null, 15, null, true));

// 当按下回车或点击 submit_btn 按钮后调用事件处理函数
submit_btn.addEventListener(MouseEvent.CLICK, sendMessage);
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

// 事件处理函数
function onKeyDown(evt:KeyboardEvent):void {
if (evt.keyCode == Keyboard.ENTER) {
sendMessage(null);
}
}

function sendMessage(evt:Event):void {
// 测试:将 input_txt 的内容输出到 output_txt 中
output_txt.appendText(input_txt.text + "\n");

// 清空 input_txt,并设置焦点到 input_txt
input_txt.text = "";
stage.focus = input_txt;
}

三、编写客户端 Socket
1. 首先,Socket 连接非常简单:
var socket:Socket = new Socket();
socket.connect("127.0.0.1", 8888);
其中 connect() 方法中的两个参数分别为是主机名和端口号(端口号尽量用 1024 以上)。好了,这样就连接上了。接下来是读写的问题。

2. 向服务器端写入字符串:我们在 sendMessage() 方法中进行写入操作,注意写出的字串必需以回车(\n)结束:
function sendMessage(evt:Event):void {
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(input_txt.text + "\n");
socket.writeBytes(bytes);
socket.flush();

// 清空 input_txt,并设置焦点到 input_txt
input_txt.text = "";
stage.focus = input_txt;
}

3. 读取服务器端写回的字符串:最后将服务器发回的字符串输出到 output_txt 文本域中:
// 当客户端 socket 收到数据后会调用 readMessage() 函数
socket.addEventListener(ProgressEvent.SOCKET_DATA, readMessage);

function readMessage(evt:ProgressEvent):void {
output_txt.appendText(socket.readUTF() + "\n");
}

四、Flash 客户端全部脚本
// ************ 组件参数初始化 ************
submit_btn.label = "发送消息";
output_txt.editable = false;

input_txt.setStyle("textFormat", new TextFormat(null, 15));
output_txt.setStyle("textFormat", new TextFormat(null, 15));
submit_btn.setStyle("textFormat", new TextFormat(null, 15, null, true));

submit_btn.addEventListener(MouseEvent.CLICK, sendMessage);
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

function onKeyDown(evt:KeyboardEvent):void {
if (evt.keyCode == Keyboard.ENTER) {
sendMessage(null);
}
}

function sendMessage(evt:Event):void {
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(input_txt.text + "\n");
socket.writeBytes(bytes);
socket.flush();

input_txt.text = "";
stage.focus = input_txt;
}

// ************ 客户端 Socket ************
var socket:Socket = new Socket();
socket.connect("127.0.0.1", 8888);
socket.addEventListener(ProgressEvent.SOCKET_DATA, readMessage);

function readMessage(evt:ProgressEvent):void {
output_txt.appendText(socket.readUTF() + "\n");
}

五、编写 Java 服务器端 Socket
最后,我们需要编写 Java 后台服务器端的代码。
首先,创建一个 ServerSocket 作为Socket 服务器。当有客户端连接后通过 accept() 方法即可得到客户端的 Socket:

ServerSocket socketServer = new ServerSocket(8888);
System.out.println("服务器已启动,等待客户端连接");

// accept() 方法是阻塞式的,当有客户端连接成功后才继续执行
Socket socket = socketServer.accept();
System.out.println("客户端连接成功");

然后得到与客户端的输入流和输出流(输入流是客户端连接到服务器的管道,输出流则是服务器到客户端的管道):
// 获得输入流和输出流,输入流为 BufferedReader 类型,输出流为 DataOutputStream 类型
BufferedReader reader =
new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());

拿到输入输出流以后,就可以通过输入流(InputStream)读取 Flash 客户端发来的字符串,通过输出流(OutputStream)向 Flash 客户端写字符串:
while (true) {
// readLine() 方法也是阻塞式的,当客户端有消息发来就读取,否则就一直等待
String msg = reader.readLine();

// 当客户端发送的字符串为 null 时,说明客户端已经关闭,此时退出循环
if (msg == null) {
System.out.println("客户端已离开");
break;
}

// 将读入的信息加工后再写回客户端
writer.writeUTF("写回客户端的" + msg);
}

以上是ServerSocket 与 AS 3 Socket 通信的基本原理。在实际应用中,会有多个客户端连接这个ServerSocket,因此要创建一个多线程的 Socket 服务器。
下面简述一下多线程 Socket 服务器原理:当socketServer.accept() 之后就需要实例化一个线程对象,在该对象中持有socketServer.accept() 返回的 Socket 对象,然后让线程跑起来执行读写操作。如果再来一个客户端就再跑一个线程,同样执行读写操作。同时,用一个 List 容器来管理这些对象。
最终服务器端的代码如下:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FlashScoket {
private List<Client> clientList = new ArrayList<Client>();

public static void main(String[] args) {
new FlashScoket().runSocket();
}

private void runSocket() {
try {
ServerSocket socketServer = new ServerSocket(8888);
System.out.println("服务器已启动,等待客户端连接");

while (true) {
// accept() 方法是阻塞式的,当有客户端连接成功后才继续执行
Socket socket = socketServer.accept();
System.out.println("客户端连接成功");

// 实例化一个 Client 对象,并启动该线程
Client client = new Client(socket);
clientList.add(client);
client.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

class Client extends Thread {
private Socket socket;

private BufferedReader reader;
private DataOutputStream writer;

private Client(Socket socket) {
this.socket = socket;
try {
// 获得输入流和输出流,输入流为 BufferedReader 类型,输出流为 DataOutputStream 类型
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
writer = new DataOutputStream(socket.getOutputStream());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
try {
while (true) {
// readLine() 方法也是阻塞式的,当客户端有消息发来就读取,否则就一直等待
String msg = reader.readLine();

// 当客户端发送的字符串为 null 时,说明客户端已经关闭,此时退出循环
if (msg == null) {
clientList.remove(this);
System.out.println("客户端已离开");
break;
}

// 将读入的内容写给每个客户端
for (Iterator<Client> it = clientList.iterator(); it.hasNext();) {
Client client = it.next();
client.getWriter().writeUTF(msg);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭 socket 及相关资源
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

public DataOutputStream getWriter() {
return writer;
}
}
}

六、补充技术
1. 如何测试?
* 首先要编译FlashScoket —— javac FlashScoket
* 然后启动FlashScoket —— java FlashScoket
* 最后将 Flash 发布为 exe 文件格式,同时开启多个即可。

2. 自动跟踪到最后一行:当收到新的消息时自动滚动到最后一行,在 readMessage() 方法中加入:
output_txt.verticalScrollBar.scrollPosition = output_txt.verticalScrollBar.maxScrollPosition;

3. 当出现输入/输出错误并导致发送或加载操作失败时提示用户,加入对IO_ERROR 的侦听:
socket.addEventListener(IOErrorEvent.IO_ERROR, socketIOError);
function socketIOError(evt:IOErrorEvent):void {
output_txt.appendText("服务器端尚未开启,请稍后再试\n");
}

4. 在sendMessage() 中加入对空字符串的验证,如果为空则 return:
if (input_txt.text == "") {
return;
}

5. 在消息前面显示用户名:大家可以制作一个登录页面,输入用户名,假设已将输入的用户名存放在 userName 变量中,在写入时加进去:
var userName:String = "FL 车在臣";
在 sendMessage() 中相应改为:
bytes.writeUTFBytes(userName + " : " + input_txt.text + "\n");

6. 使用output_txt .htmlText 输出文字,那么相应的写入格式可以调整为:
bytes.writeUTFBytes("<font color='#0000FF'>" + userName + " : </font>" + input_txt.text + "\n");

3. socket 编程是什么

Socket编程是一种网络编程技术,它允许两个程序通过网络进行通信。以下是对Socket编程的详细解释:

基本概念

传输层协议

Socket编程的主要步骤

  1. 创建Socket:使用socket函数创建一个socket,这是网络通信的基础。
  2. 绑定Socket:将创建的socket绑定到一个特定的端口上,以便客户端能够找到并连接到服务器。
  3. 监听连接(仅服务器):使用listen函数监听来自客户端的连接请求。
  4. 接受连接(仅服务器):使用accept函数接受客户端的连接请求,建立通信连接。
  5. 数据交换:使用send和recv等函数在客户端和服务器之间进行数据交换。
  6. 关闭Socket:通信完成后,使用close函数关闭socket,释放资源。

示例:虽然示例代码在此被截断,但通常一个简单的TCP Socket服务器会遵循上述步骤,从创建socket到监听连接、接受连接、数据交换,最后关闭socket。客户端代码则会相对简单一些,主要涉及到创建socket、连接到服务器以及数据交换等步骤。

总的来说,Socket编程是网络编程的核心,它使得不同计算机上的程序能够进行通信,从而实现分布式系统的构建和数据的共享。

4. JAVA 问题,用socket编写一个客户端程序

给你一个我写的示例,用的是基于TCP的Socket技术,你锻炼一下,改一改,不会改再找我!
客户端:
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class TcpClient {

public static void main(String[] args) throws Exception
{
//创建客户端Socket服务,并且制定主机和ank
Socket s = new Socket("192.168.1.104",10002);//连接固定的主机和端口

//为了发送数据,获取Socket中的输入输出流
OutputStream out = s.getOutputStream();
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line = null;

//读取服务器发过来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];

while((line = br.readLine())!=null)
{
out.write(line.getBytes());
if("886".equals(line))
break;

int len = in.read(buf);
String content = new String(buf,0,len);
System.out.println("Server:"+content);
}

s.close();

}
}

服务器:
/*
* 需求分析:
* 使用TCP协议,写服务器端。做到服务器能收到客户端的信息,也能向客户端发送信息
* */

package JavaNetProgramming;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class TcpServer {
public static void main(String[] args) throws Exception
{
//建立服务器的Socket服务,并且监听一个端口
ServerSocket ss = new ServerSocket(10002);
Socket s = ss.accept();
InputStream is = s.getInputStream();

//从服务器端向客户端发送数据
OutputStream out = s.getOutputStream();
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String line = null;

while(true)
{
//通过accept()方法获得客户端传过来的Socket对象

// System.out.println("getByNanme():"+s.getInetAddress());
System.out.print("getHostAddress():"+s.getInetAddress().getHostAddress());

//获取客户端发过来的数据,就要使用客户端对象的读取流来读取数据

byte[] buf = new byte[1024];
int len = is.read(buf);//把流中数据读到字节数组中
String content = new String(buf,0,len);
System.out.println(" "+content);

if("886".equals(content))
break;
while((line = br.readLine())!=null)
{
out.write(line.getBytes());
break;
}

}

s.close(); //循环内有判断语句,这句话才不出错
ss.close();

}

}

5. UDP和Socket通信步骤

UDP Server程序
1、编写UDP Server程序的步骤
(1)使用()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。
(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。
(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。

2、udpserv.c程序内容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 80
#define SERV_PORT 8888

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];

for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}

int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;

sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}

do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;
}

UDP Client程序
1、编写UDP Client程序的步骤
(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。
(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。
(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。
(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。
(6)处理接收到的数据,这里是直接输出到标准输出上。

2、udpclient.c程序内容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXLINE 80
#define SERV_PORT 8888

void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];

/* connect to server */
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)
{
perror("connect error");
exit(1);
}

while(fgets(sendline, MAXLINE, fp) != NULL)
{
/* read a line and send to server */
write(sockfd, sendline, strlen(sendline));
/* receive data from server */
n = read(sockfd, recvline, MAXLINE);
if(n == -1)
{
perror("read error");
exit(1);
}
recvline[n] = 0; /* terminate string */
fputs(recvline, stdout);
}
}

int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in srvaddr;

/* check args */
if(argc != 2)
{
printf("usage: udpclient <IPaddress>\n");
exit(1);
}

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("[%s] is not a valid IPaddress\n", argv[1]);
exit(1);
}

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

return 0;
}

运行例子程序
1、编译例子程序
使用如下命令来编译例子程序:
gcc -Wall -o udpserv udpserv.c
gcc -Wall -o udpclient udpclient.c
编译完成生成了udpserv和udpclient两个可执行程序。

2、运行UDP Server程序
执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:32768 0.0.0.0:*
udp 0 0 0.0.0.0:8888 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。
如果这时再执行./udpserv &命令,就会看到如下信息:
bind error: Address already in use
说明已经有一个服务程序在运行了。

3、运行UDP Client程序
执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:
Hello, World!
Hello, World!
this is a test
this is a test
^d
输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。
如果服务程序没有启动,而执行客户程序,就会看到如下信息:
$ ./udpclient 127.0.0.1
test
read error: Connection refused
说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpmp程序来抓包,会发现收到的是ICMP的错误信息。

阅读全文

与简单的socket程序相关的资料

热点内容
win10系统备份镜像文件在哪删除 浏览:712
cf网络老掉线 浏览:506
java写文件相对路径 浏览:94
java枚举数据类型 浏览:248
ps指定配置文件的步骤 浏览:724
苹果怎么更新app需要验证 浏览:653
creo20怎么导入自己的配置文件 浏览:440
iphone打开文件里面什么都没有 浏览:178
ps怎么打开ai格式的文件 浏览:293
顺丰文件袋尺寸是多少厘米 浏览:792
光猫网络如何稳定 浏览:591
什么叫把数据集横向划分 浏览:275
vba创建excel文件 浏览:687
华为荣耀8隐藏设置密码 浏览:744
恢复出厂设置之后怎么下载app 浏览:351
js设置audio循环播放 浏览:800
苹果手机用其它数据线弹屏怎么办 浏览:626
编程类网站有哪些内容 浏览:112
用vba打印pdf文件内容 浏览:129
网购在什么网站买放心 浏览:790

友情链接