Windows XPマルチNIC tcp転送


c++書き込みの簡単な複数のNICバインドテストクライアント
#include <WinSock2.h>
#include <stdio.h>
#include <time.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")

int tarPort = 0;
char szTarget [100] = "";

struct tparam{
    char szIpAddr [100];
    int  port;
};

void threadrxtx(void * args)
{
    tparam * t = (tparam*) args;
    int ret = 0;
    SOCKET sfd = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in sself;
    sself.sin_family = AF_INET;
    sself.sin_port   = htons(t->port);
    sself.sin_addr.s_addr = inet_addr(t->szIpAddr);
    ret =  (bind(sfd, (sockaddr *)&sself, sizeof(sself)));

    if (ret < 0)
    {
        printf("$(%s:%d) exit\r
", __FILE__, __LINE__); return ; } sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(tarPort); saddr.sin_addr.s_addr = inet_addr(szTarget); ret = (connect(sfd, (sockaddr *)&saddr, sizeof(saddr))); if (ret < 0) { printf("$(%s:%d) exit\r
", __FILE__, __LINE__); return ; } while (true) { char szMsg [0x400] = ""; memset(szMsg, 'A', sizeof(szMsg)); szMsg[0x400-2] = '\r'; szMsg[0x400-1] = '
'; int rs = send(sfd, szMsg, sizeof(szMsg), 0); if (rs < 0) { printf("$(%s:%d) exit\r
", __FILE__, __LINE__); return ; } printf(" %s send %d bytes\r
",t->szIpAddr, rs); char szbuf [100]; memset(szbuf, 0, 100); int rr = recv(sfd, szbuf, 100, 0); if (rr > 0){ szbuf[100-1] = 0; printf("[%s]time: [%d] msg: ..., bytes: %d .\r
", t->szIpAddr, GetTickCount(), /*szbuf*/ rr); } Sleep(1000); } printf("$(%s:%d) exit\r
", __FILE__, __LINE__); } static void SetCurWorkPathToExe(void) { char szWorkPath [0x200] = ""; GetModuleFileNameA(NULL, szWorkPath, 0x200); if (strrchr(szWorkPath, '\\')) strrchr(szWorkPath, '\\')[1] = '\0'; SetCurrentDirectoryA(szWorkPath); } int main(int argc, char * argv) { WSADATA wsadata; WSAStartup(MAKEWORD(2,2), &wsadata); SetCurWorkPathToExe(); FILE * fp = fopen("iplist.txt", "r"); fscanf(fp, "%s : %d", szTarget, &tarPort); char szTest[1000]; fscanf(fp, "%s", szTest); while (!feof(fp)) { tparam * t = new tparam; fscanf(fp, "%s : %d", t->szIpAddr, &t->port); _beginthread(threadrxtx, 0, t); } fclose(fp); getchar(); return 0; }

簡単なjavaマルチスレッドechoサーバ(http://www.4ucode.com/Study/Topic/1128385)
import java.io.*;
import java.net.*;

public class ThreadedECHOServer
{
    public static void main(String[] args)
    {
        int i=1;
        try
        {
            ServerSocket s=new ServerSocket(2500);
            for(;;)
            {
                Socket incoming = s.accept();
                System.out.println("Spawning"+i);
                new ThreadedEchoHandler(incoming,i).start();
                i++;
            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

class ThreadedEchoHandler extends Thread
{
    private Socket incoming;
    private int counter;
    public ThreadedEchoHandler(Socket i,int c)
    {
        incoming =i;
        counter =c;
    }
    
    public void run()
    {
        try
        {
            BufferedReader in =new BufferedReader(new InputStreamReader(incoming.getInputStream()));
            PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);
            out.println("Hello!Enter BYE to exit.");
            boolean done =false;
            while(!done)
            {
                String str = in.readLine();
                if(str == null) done =true;
                else
                {
                    out.println("Echo("+counter+"):"+str);
                    if(str.trim().equals("BYE"))
                        done = true;
                }
            }
            incoming.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

iplist.txt(サーバipとポート、ローカルNICとポート)
10.12.23.47 : 2500
-------------------------------
10.0.2.15 : 5553
10.0.3.15 : 5550
10.0.4.15 : 5551
10.0.5.15 : 5552

テスト環境はvirtualboxで行います.