TCP console server & client

server

/*************************** Server ********************/
// Module Name: Server.c
// Description:
//    This example illustrates a simple TCP server that accepts
//    incoming client connections. Once a client connection is
//    established, a thread is spawned to read data from the
//    client and echo it back (if the echo option is not
//    disabled).
// Compile:
//    cl -o Server Server.c ws2_32.lib
// Command line options:
//    server [-p:x] [-i:IP] [-o]
//           -p:x      Port number to listen on
//           -i:str    Interface to listen on
//           -o        Receive only, don't echo the data back

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_PORT        168
#define DEFAULT_BUFFER      4096

int    iPort      = DEFAULT_PORT; // Port to listen for clients on
char   szAddress[128];       // Interface to listen for clients on

// Function: ClientThread
// Description:
//    This function is called as a thread, and it handles a given
//    client connection.  The parameter passed in is the socket
//    handle returned from an accept() call.  This function reads
//    data from the client and writes it back.

DWORD WINAPI ClientThread(LPVOID lpParam)
{
    SOCKET        sock=(SOCKET)lpParam;
    char          szBuff[DEFAULT_BUFFER];
    int           ret,nLeft,idx;
    
    while(1)
    {
        // Perform a blocking recv() call
        ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
        if (ret == 0)        // Graceful close
            break;
        else if (ret == SOCKET_ERROR)
        {
            printf("recv() failed: %d\n", WSAGetLastError());
            break;
        }
        szBuff[ret] = '\0';
        printf("RECV: '%s'\n", szBuff);
        // echo the data back, do it
        nLeft = ret;
        idx = 0;
        // Make sure we write all the data
        while(nLeft > 0)
        {
            ret = send(sock, &szBuff[idx], nLeft, 0);
            if (ret == 0)
                break;
            else if (ret == SOCKET_ERROR)
            {
                printf("send() failed: %d\n",
                WSAGetLastError());
                break;
            }
            nLeft -= ret;
            idx += ret;
        }
    }
    return 0;
}

// Function: main
// Description:
//    Main thread of execution. Initialize Winsock, parse the
//    command line arguments, create the listening socket, bind
//    to the local address, and wait for client connections.
int main(int argc, char **argv)
{
    WSADATA       wsd;
    SOCKET        sListen,sClient;
    int           iAddrSize;
    HANDLE        hThread;
    DWORD         dwThreadId;
    struct sockaddr_in local,client;

	//Initialize Winsock
	printf("Initialize WinSock\n");
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        printf("Failed to load Winsock!\n");
        printf("Close this program!\n");
        return 1;
    }
    ZeroMemory(&local, sizeof(local));
    local.sin_family = AF_INET;
    local.sin_port = htons(iPort);
    local.sin_addr.s_addr = inet_addr("192.168.0.10");
    // Create our listening socket
    sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sListen == SOCKET_ERROR)
    {
        printf("socket() failed: %d\n", WSAGetLastError());
        printf("Close this program!\n");
        return 1;
    }
    else
        printf("Socket is ready.\n");

   if (bind(sListen, (struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
    {
        printf("bind() failed: %d\n", WSAGetLastError());
        printf("Close this program!\n");
        return 1;
    }
    listen(sListen, 8);
    // In a continous loop, wait for incoming clients. Once one
    // is detected, create a thread and pass the handle off to it.
    while (1)
    {
        iAddrSize = sizeof(client);
        sClient = accept(sListen, (struct sockaddr *)&client,&iAddrSize);
        if (sClient == INVALID_SOCKET)
        {
            printf("accept() failed: %d\n", WSAGetLastError());
            break;
        }
        printf("Accepted client: %s:%d\n",
        inet_ntoa(client.sin_addr), ntohs(client.sin_port));
        hThread = CreateThread(NULL, 0, ClientThread,(LPVOID)sClient, 0, &dwThreadId);
        if (hThread == NULL)
        {
            printf("CreateThread() failed: %d\n", GetLastError());
            break;
        }
        CloseHandle(hThread);
    }
    closesocket(sListen);
    WSACleanup();
    return 0;
}

console

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define DEFAULT_COUNT       20
#define DEFAULT_PORT        168
#define DEFAULT_BUFFER      4096
using namespace std;
char  szMessage[1024];        // Message to send to sever
int   iPort     = DEFAULT_PORT;  // Port on server to connect to

// Function: main
// Description:
//    Main thread of execution. Initialize Winsock, parse the
//    command line arguments, create a socket, connect to the
//    server, and then send and receive data.
int main(void)
{
    WSADATA       wsd;
    SOCKET        sClient;
    char          szBuffer[DEFAULT_BUFFER];
    int           ret,i;
    struct sockaddr_in server;
    struct hostent    *host = NULL;
    
    printf("Initialize WinSock\n");
    // Parse the command line and load Winsock
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        printf("Failed to load Winsock library!\n");
        printf("Close this program!");
        return 1;
    }

    // Create the socket, and attempt to connect to the server
    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient == INVALID_SOCKET)
    {
        printf("socket() failed: %d\n", WSAGetLastError());
        printf("Close this program!");
        return 1;
    }
    printf("Socket is ready.\n");
    server.sin_family = AF_INET;
    server.sin_port = htons(iPort);
    server.sin_addr.s_addr = inet_addr("192.168.0.10");

    //connect to server
    if (connect(sClient, (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
    {
        printf("connect() failed: %d\n", WSAGetLastError());
        closesocket(sClient);
        printf("Close socket!\n");
        printf("Close this program!");
        return 1;
    }
    printf("Connect to Server!\n");
    // Send and receive data
    do
    {
        cin >> szMessage;
        ret = send(sClient, szMessage, strlen(szMessage), 0);
        if (ret == 0)
           break;
        else if (ret == SOCKET_ERROR)
        {
            printf("send() failed: %d\n", WSAGetLastError());
            break;
        }
        printf("Send %d bytes\n", ret);
        
        ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
        if (ret == 0)
            break;
        else if (ret == SOCKET_ERROR)
        {
            printf("recv() failed: %d\n", WSAGetLastError());
            break;
        }
        szBuffer[ret] = '\0';
        printf("RECV [%d bytes]: '%s'\n", ret, szBuffer);
    } while( strcmp(szBuffer,"bye") );
    
    closesocket(sClient);
    WSACleanup();
    printf("See you~~\n");
    system("pause");
    return 0;
}

只是個範例

转载于:https://www.cnblogs.com/dforce/articles/1878514.html

### 回答1: VB.NET是一种使用Visual Basic编程语言的开发环境,可以用于创建各种类型的应用程序,包括网络应用程序。TCP服务器是一种基于TCP/IP协议的服务器,它通过TCP连接来与客户端进行通信。 在VB.NET中,可以使用System.Net命名空间中的TcpListener类来创建一个TCP服务器。TcpListener类提供了一组方法和属性,用于监听指定的IP地址和端口,并接受客户端的连接请求。一旦客户端和服务器建立了连接,就可以使用TcpClient类发送和接收数据。 为了创建一个TCP服务器,首先需要创建一个TcpListener对象并指定要监听的IP地址和端口。然后,可以通过调用TcpListener的Start方法开始监听。接下来,可以通过调用TcpListener的AcceptTcpClient方法接受客户端的连接请求,并返回一个TcpClient对象,用于与客户端进行通信。 一旦与客户端建立了连接,可以使用TcpClient对象的GetStream方法获取与客户端之间的网络流。通过这个网络流可以发送和接收数据。可以使用StreamReader和StreamWriter类来读取和写入文本数据,或者使用BinaryReader和BinaryWriter类来读取和写入二进制数据。 当不再需要监听连接时,可以调用TcpListener的Stop方法停止监听。同时,可以调用TcpClient的Close方法关闭与客户端的连接。 需要注意的是,在创建TCP服务器时,可能需要考虑并发连接和线程管理。可以使用多线程技术来处理并发连接,确保每个客户端的请求都能得到及时响应。 总之,使用VB.NET可以轻松创建一个TCP服务器,实现与客户端的通信。通过TcpListener和TcpClient类,可以监听连接、接受连接请求,并与客户端进行数据交换。 ### 回答2: VB.NET是一种面向对象的编程语言,而TCP服务器(TCP Server)则是一种网络编程模型。在VB.NET中,我们可以使用一些内置的类库和对象来创建一个TCP服务器。 要创建一个TCP服务器,我们首先需要使用System.Net命名空间下的TcpListener类。通过TcpListener类,我们可以建立一个TCP监听器,用于侦听客户端的连接请求。 下面是一个简单的示例代码,用于创建一个TCP服务器: ```vb Imports System.Net Imports System.Net.Sockets Module Module1 Sub Main() Dim ipAddress As IPAddress = IPAddress.Parse("127.0.0.1") Dim port As Integer = 8888 Dim listener As New TcpListener(ipAddress, port) listener.Start() Console.WriteLine("服务器启动,等待客户端连接...") While True Dim client As TcpClient = listener.AcceptTcpClient() Console.WriteLine("客户端已连接!") ' 处理客户端连接的逻辑 ' 此处可以编写与客户端进行通信的代码 client.Close() Console.WriteLine("客户端已断开连接!") End While End Sub End Module ``` 上述示例代码中,我们首先创建了一个IP地址和端口号,用于定义服务器监听的地址和端口。然后,我们创建了一个TcpListener对象,并通过Start()方法来启动服务器。然后,我们使用一个无限循环来接受客户端的连接请求。当有客户端连接时,我们创建了一个TcpClient对象来处理客户端的连接请求。在连接建立后,可以编写与客户端进行通信的逻辑代码。最后,我们关闭连接并循环回到接受连接的过程。 通过上述示例代码,我们可以实现一个简单的TCP服务器。当然,实际应用中可能需要更多的逻辑来处理客户端连接请求、数据传输等。但无论如何,VB.NET提供了丰富的类库和对象,可以方便地完成TCP服务器的开发。 ### 回答3: VB.NET是一种使用Visual Basic语言的编程环境,用于开发Windows应用程序。TCP服务器是一种网络应用程序,用于与客户端建立TCP连接并处理请求。在VB.NET中创建一个TCP服务器需要以下步骤: 1. 导入命名空间:首先,在代码文件的顶部导入System.Net和System.Net.Sockets命名空间,这些命名空间包含了创建TCP服务器所需的类和方法。 2. 创建服务器端套接字:使用ServerSocket类的实例化对象,监听指定的IP地址和端口号。例如,可以使用TcpListener类来创建一个监听特定IP地址和端口号的TCP服务器。 3. 监听客户端连接请求:使用AcceptTcpClient方法开始监听来自客户端的连接请求。此方法将在服务器端接收到客户端的连接请求时返回一个TcpClient对象。 4. 处理客户端请求:接收到客户端的连接请求后,可以使用TcpClient对象进行数据的收发操作,使用StreamReader和StreamWriter类来读取和写入数据,以及实现与客户端的通信。 5. 关闭服务器:当不需要再监听客户端连接请求时,可以使用Stop()方法关闭服务器。 下面是一个简单的VB.NET TCP服务器示例代码: Imports System.Net.Sockets Public Class TCP_Server Public Sub StartServer() Dim serverSocket As TcpListener = Nothing Dim clientSocket As TcpClient = Nothing Dim serverIP As String = "127.0.0.1" Dim serverPort As Integer = 8888 Try serverSocket = New TcpListener(IPAddress.Parse(serverIP), serverPort) serverSocket.Start() Console.WriteLine("服务器已启动,等待客户端连接...") clientSocket = serverSocket.AcceptTcpClient() Console.WriteLine("客户端已连接...") ' 处理客户端请求代码 Catch ex As Exception Console.WriteLine("发生错误:" & ex.Message) Finally If clientSocket IsNot Nothing Then clientSocket.Close() End If If serverSocket IsNot Nothing Then serverSocket.Stop() End If End Try End Sub End Class 这只是一个简单的示例,实际上可以根据具体需求进行更复杂的操作,如处理多个客户端请求、实现多线程并发等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值