求一个C语言的TCP 客户服务 连接示例代码

求一个C语言的TCP 客户服务 连接示例代码,第1张

#include <stdio.h>

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

void main() {

// 初始化

WSADATA wsaData

int iResult = WSAStartup( MAKEWORD(2,2), &wsaData )

if ( iResult != NO_ERROR )

printf("Error at WSAStartup()\n")

// 建立socket

SOCKET server

server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )

if ( server == INVALID_SOCKET ) {

printf( "Error at socket(): %ld\n", WSAGetLastError() )

WSACleanup()

return

}

// 绑定socket

sockaddr_in service

service.sin_family = AF_INET

service.sin_addr.s_addr = inet_addr( "127.0.0.1" )

service.sin_port = htons( 27015 )

if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {

printf( "bind() failed.\n" )

closesocket(server)

return

}

// 监听 socket

if ( listen( server, 1 ) == SOCKET_ERROR )

printf( "Error listening on socket.\n")

// 接受连接

SOCKET AcceptSocket

printf( "Waiting for a client to connect...\n" )

while (1) {

AcceptSocket = SOCKET_ERROR

while ( AcceptSocket == SOCKET_ERROR ) {

AcceptSocket = accept( server, NULL, NULL )

}

printf( "Client Connected.\n")

server = AcceptSocket

break

}

// 发送接受数据

int bytesSent

int bytesRecv = SOCKET_ERROR

char sendbuf[32] = "Server: Sending Data."

char recvbuf[32] = ""

bytesRecv = recv( server, recvbuf, 32, 0 )

printf( "Bytes Recv: %ld\n", bytesRecv )

bytesSent = send( server, sendbuf, strlen(sendbuf), 0 )

printf( "Bytes Sent: %ld\n", bytesSent )

return

}

SERVER的

using System

using System.Collections.Generic

using System.Net

using System.Net.Sockets

using System.Threading

using System.Text

using System.IO

class Server

{

    Socket _listenSocket

    Dictionary<string, ClientProcess> _clients

    public Server(int port)

    {

        _clients = new Dictionary<string, ClientProcess>()

        _listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

        IPEndPoint lep = new IPEndPoint(IPAddress.Any, port)

        _listenSocket.Bind(lep)

    }

    public void Start()

    {

        _listenSocket.Listen(5)

        for (  )

        {

            Socket client = _listenSocket.Accept()

            ClientProcess cp = new ClientProcess(this, client)

            ThreadStart ts = new ThreadStart(cp.Process)

            Thread t = new Thread(ts)

            t.Start()

        }

    }

    public void AddClient(string email, ClientProcess c)

    {

        lock (_clients)

        {

            if (!_clients.ContainsKey(email))

                _clients.Add(email, c)

        }

    }

    public void RemoveClient(string email)

    {

        lock (_clients)

        {

            if (_clients.ContainsKey(email))

                _clients.Remove(email)

        }

    }

    public void SendTo(string from, string email, string msg)

    {

        ClientProcess cp

        lock(_clients) {

            _clients.TryGetValue(email, out cp)

        }

        if (cp != null)

        {

            cp.Send(from, msg)

        }

    }

}

class ClientProcess

{

    Server _serv

    Socket _s

    TcpClient _tc

    StreamReader _sr

    StreamWriter _sw

    string email

    public ClientProcess(Server serv, Socket s)

    {

        _serv = serv

        _s = s

        _tc = new TcpClient()

        _tc.Client = _s

        _sr = new StreamReader(_tc.GetStream())

        _sw = new StreamWriter(_tc.GetStream())

    }

    public void Process()

    {

        try

        {

            email = _sr.ReadLine()

            _serv.AddClient(email, this)

            for (  )

            {

                string l = _sr.ReadLine()

                int i = l.IndexOf(':')

                if(i == -1)    

                    continue

                string em = l.Substring(0, i)

                string msg = l.Substring(i + 1)

                _serv.SendTo(email, em, msg)

            }

        }

        catch

        {

            _serv.RemoveClient(email)

        }

    }

    public void Send(string email, string msg)

    {

        _sw.WriteLine("{0}:{1}", email, msg)

        _sw.Flush()

    }

}

class Program

{

    static void Main(string[] args)

    {

        Server s = new Server(12345)

        s.Start()

    }

}

协议是这样的:

1、发送和接收都是以行为单位的

2、客户端连接后发送的第一行数据是自己的邮箱

3、客户端之后发送的格式是:  对方邮箱 冒号 要发送的消息。冒号是英文半角冒号,邮箱和冒号间没有空格

首先需要在电脑上搭建服务器,关于网上好多按步骤安装apache,sql,phpmyadmin的方法复杂而且没有必要,这里推荐wamp这样的一个集成软件,安装非常简单,一路点击next,apache+sql+phpmyadmin的环境一键搭好。

在百度中搜索Wamp下载,直接下载就行。下载完wamp进行安装,一路点击next,装在c:\wamp下,最后install完成.

在浏览器输入localhost,出现以下页面说明安装成功了。现在服务器和php环境算是搭好了。此时在桌面右下角任务栏中会有wamp的图标,点击会有下图显示,www是网站页面根目录,localhost是网站默认主页,点击phpmyadmin可以进入数据库管理界面.

现在网站只能在PC上显示,如何能把网站放到互联网上让朋友也欣赏一下。这时就需要一款叫花生壳的软件,提供动态的域名映射.

下载网址如下:http://hsk.oray.com/download/#type=windows|lan

下载完软件按步骤安装即可,这时候需要注册一下花生壳会员,注册时按网页提示的步骤即可,用身份z注册可以获得一个免费域名。用注册的账号密码登陆软件。会出现以下界面。这里的网址是申请的免费域名。

在域名上右键,选择新花生壳管理,填写应用名称,这个可以随便填,内网主机为本机内网的ip地址,这时需要查看以下,win+R在cmd中输入,ipconfig/all,

可以看到ipv4地址,填写即可。端口为80端口。

同时,现在需要设置一下路由器。在浏览器输入192.168.1.1。输入路由器用户名和密码,一般都为admin。进入路由器界面。需要设置三个地方,首先是动态DNS,选择服务商为花生壳,填写用户名密码,验证保存。然后是转发规则中的虚拟服务器,添加新条目,端口80,ip地址为内网ip。最后是,DMZ主机,设置开启,ip为内网本机ip。

现在设置基本完成,这时就可以测试了。注意,要把防火墙关闭,否则外网还是访问不了本机的网站。在控制面板中把防火墙关闭。现在可以写一段html代码,命名为index.html(注意此时先把index.php放到别的文件夹)放入wamp\www目录中,来测试访问。

最后,在浏览器输入花生壳域名,看看是不是就能访问了。同时也可以把自域名发送给朋友,让他们帮测试一下。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11568893.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存