网络程序设计-第一个socket程序

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

   网络程序设计开课了,写了个socket,目前还不完善,先贴出来,改进后再改

服务器端代码如下:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<time.h>

#define  SERVER_PORT 8080
#define  BUFFER_SIZE 255 
/*
1.socket
2.connect
3.send
4.recv
5.close
*/
int getPort();
int getConnection(char *ip);
void communication(char *ip);

int main(int argc, char *argv[])
{
    communication(argv[1]);
    return 0;
}
/*获得端口号,由随机数生成*/
int getPort()
{
    int port = 0;
    srand(time(NULL));
    port = (8080+rand()%65335);
    return port;
}
/*获得连接,返回套接字句柄clientfd*/
int getConnection(char *ip)
{
    int clientfd;
    int connectionfd;
    int length = 0;
    struct sockaddr_in serveraddr;
    struct sockaddr_in clientaddr;
    
    if( (clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("create socket error!\n");
        exit(1);
    }
    
    int clientport = getPort();
    
    bzero((char *)&clientaddr, sizeof(clientaddr));
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_port = htons(clientport);
    clientaddr.sin_addr.s_addr = htons(INADDR_ANY);
    
    /*初始化服务器套接字地址结构,以用于连接*/
    bzero((char *)&serveraddr, sizeof (serveraddr));
    serveraddr.sin_family = AF_INET;
    inet_aton(ip, &serveraddr.sin_addr);
    serveraddr.sin_port = htons(SERVER_PORT);//将一个点分十进制串转换为一个网络字节序的ip地址
    // serveraddr.sin_addr.s_addr = htons(INADDR_ANY);
    
    if( (connectionfd = connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 )
    {
        printf("can't connect to %s!\n", ip);
        exit(0);
    } 
    return clientfd;
}
/*申请服务,并接收服务器响应*/
void communication(char *ip)
{
    char buf[BUFFER_SIZE];
    char recvmsg[BUFFER_SIZE];
    
    int clientfd = getConnection(ip);
    while(1)
    {
        printf("enter a string:");
        scanf("%s", buf);
        if( strcmp(buf, "q") == 0 )
            break;
        send(clientfd, buf, BUFFER_SIZE, 0);
        recv(clientfd, recvmsg, strlen(recvmsg), 0);
        printf("%s\n", recvmsg);
        //fflush(stdin); select()
    }
    close(clientfd);
}




客户端代码:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<netinet/in.h>
#include<time.h>

#define  SERVER_PORT 8080
#define  BUFFER_SIZE 255 
/*
1.socket
2.connect
3.send
4.recv
5.close
*/
int getPort();
int getConnection(char *ip);
void communication(char *ip);

int main(int argc, char *argv[])
{
    communication(argv[1]);
    return 0;
}
/*获得端口号,由随机数生成*/
int getPort()
{
    int port = 0;
    srand(time(NULL));
    port = (8080+rand()%65335);
    return port;
}
/*获得连接,返回套接字句柄clientfd*/
int getConnection(char *ip)
{
    int clientfd;
    int connectionfd;
    int length = 0;
    struct sockaddr_in serveraddr;
    struct sockaddr_in clientaddr;
    
    if( (clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("create socket error!\n");
        exit(1);
    }
    
    int clientport = getPort();
    
    bzero((char *)&clientaddr, sizeof(clientaddr));
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_port = htons(clientport);
    clientaddr.sin_addr.s_addr = htons(INADDR_ANY);
    
    /*初始化服务器套接字地址结构,以用于连接*/
    bzero((char *)&serveraddr, sizeof (serveraddr));
    serveraddr.sin_family = AF_INET;
    inet_aton(ip, &serveraddr.sin_addr);
    serveraddr.sin_port = htons(SERVER_PORT);//将一个点分十进制串转换为一个网络字节序的ip地址
    // serveraddr.sin_addr.s_addr = htons(INADDR_ANY);
    
    if( (connectionfd = connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) < 0 )
    {
        printf("can't connect to %s!\n", ip);
        exit(0);
    } 
    return clientfd;
}
/*申请服务,并接收服务器响应*/
void communication(char *ip)
{
    char buf[BUFFER_SIZE];
    char recvmsg[BUFFER_SIZE];
    
    int clientfd = getConnection(ip);
    while(1)
    {
        printf("enter a string:");
        scanf("%s", buf);
        if( strcmp(buf, "q") == 0 )
            break;
        send(clientfd, buf, BUFFER_SIZE, 0);
        recv(clientfd, recvmsg, strlen(recvmsg), 0);
        printf("%s\n", recvmsg);
        //fflush(stdin); select()
    }
    close(clientfd);
}



计算机网络实验|SOCKET 网络程序设计 SOCKET 网络程序设计 【实验目的】 理解进程通信的原理及通信过程; 掌握基本的网络编程方法。 【实验内容】 进一步学习 UDP 及 TCP 协议的工作原理; 学习 SOCKET 编程的基本方法; 学习应用 C 语言与 WinSock2 进行简单的无连接的网络程序设计,实现网络数据传输; 学习应用 C 语言与 WinSock2 进行简单的面向连接的网络程序设计,实现网络数据传输。 【实... 阅读详情

相关推荐

基于socket的简单网络程序设计

基于socket的简单网络程序设计 1、实验目的与要求: (1)初步掌握TCP和UDP方式的网络编程模式。 (2)能运用Winsock提供的API函数接口进行网络程序的编写。 2、实验准备和说明: (1)要求掌握流式和数据报socket的编程模式和实现。 (2)创建本次实验工作文件夹“…\实验\实验4”。 3、实验内容与步骤:       1)工

奋起的Coder。。。 5826

实验4-基于socket的简单网络程序设计

实验4-基于socket的简单网络程序设计 1、实验目的与要求: (1)初步掌握TCP和UDP方式的网络编程模式。 (2)能运用Winsock提供的API函数接口进行网络程序的编写。

Java网络编程:Socket实现的扫描程序设计 (完整代码实现)

扫描程序设计 目标主机扫描是网络功防的基础和前提,扫描探测一台目标主机包括:确定该目标主机是否活动、目标主机的操作系统、正在使用哪些端口、对外提供了哪些服务、相关服务的软件版本等等,对这些内容的探测就是为了“对症下药”,为攻防提供参考信息。 对主机的探测工具非常多,比如大名鼎鼎的nmap、netcat、superscan,以及国内的x-scanner等等。我们自己动手做简单扫描软件或工具,用于加深对网络编程的理解。 知识点:进一步理解 new Socket()、Process类和ICMP。 一、程序设计第一

Viper的程序员修炼手册 3814

基于Socket进行通用的网络通信程序设计

( 基于Socket进行通用的网络通信程序设计 ( 基于Socket进行通用的网络通信程序设计

Socket网络编程——(一)

一、什么是Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接.的一端称为一个socket。端点由IP地址和端口号共同组成,简单的说它是IP地址和端口结合的协议。 常用的套接字 流式套接字:流套接字用于提供面向连接、可靠的数据传输服务,该服务将保证数据能够实现无差错、无重复发送,并按顺序接收(基于TCP)。 数据报套接字:数据报套接字提供了一种无连接的服务。该服务并不能保证...

start_mao的博客 1万+

网络编程(socket通信基础)

socket的C/S通信,TCP通信,涉及TCP连接知识。

vx_ahhhhyx319的博客 1465

第八讲 Java网络编程

课前索引课前思考  1. 什么是TCP/ IP协议?  2. TCP/IP有哪两种传输协议,各有什么特点?  3. 什么是URL?  4. URL和IP地址有什么样的关系?  5. 什么叫套接字(Socket)?  6. 套接字(Socket)和TCP/IP协议的关系?  7. URL和套接字(Socket)的关系?8.1 网络编程基本概念,TCP/IP协议简介8.1.1 网络基础知识

心蓝 3万+

使用Socket实现TCP和UDP网络程序设计

1、传输控制协议(TCP)和用户数据报协议(UDP)(1)TCP协议是一种以固线连线为基础的协议,它提供两台计算机间可靠的数据传送。TCP可以保证从一端数据送至连接的另一端时,数据能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同。因此,TCP协议适合可靠性要求比较高的场合。(2)UDP是无连接通信协议,不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。UDP是以独立...

ma2622595880的博客 4461

基于Socket网络编程

博客核心内容:1.Socket是什么 2.基于TCP协议的网络编程模型(一)Socket是什么 1、C/S架构与socket的关系:我们学习socket就是为了完成C/S架构的开发 2、C/S架构的软件(软件属于应用层)是基于网络进行通信的,网络的核心即一堆协议,协议即标准,你想开发一款基于网络通信的软件,就必须遵循这些标准 3、互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp

什么最重要?算法!! 1万+

Java程序设计实验六 Socket网络程序设计

[1]实验目的:理解Socket通信原理,掌握使用Socket和ServerSocket类进行TCP Socket通信的程序设计方法。 [2]实验内容: 1、使用ServerSocket类和Socket类实现按如下协议通信的服务器端和客户端程序。 服务器程序的处理规则如下: 向客户端程序发送Verifying Server!。 若读口令次数超过3次,则发送Illegal User!给客户端程序退出。否则向下执行步骤3)。 读取客户端程序提供的口令。 若口令不正确,则发送PassWord Wr

Ace2NoU的博客 6205

Socket系列(二)基于Socket网络通讯的服务端和客户端程序设计

        Socket系列一主要介绍了Socket的基础知识、工作原理以及与传统的http协议的区别。这部分内容的目的是为本文做铺垫。本文将介绍基于Socket网络通讯的服务器端和客户端程序设计。 一、服务器端的程序设计         关于Socket服务器端的内容,在这里只提供设计思路,以及相应的测界面,不提供具体的代码。系列一中有提到,Socket服务器端的程序编写流程大概有创...

NC_star的博客 4623

基于TCP/IP的Socket简单网络编程

掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并在此基础上实现更为复杂的网络编程。 2. 基本了解基于控制台的windows应用程序的编写过程。 3. 对于Windows Socket编程建立初步概念。

实验6-基于CSocket网络程序设计

1、实验目的与要求: (1)理解并掌握 MFC 类层次结构和基本编程方法。 (2)熟练掌握 CSocket 类的编程模型及其使用方式。 (3)采用 C/S 模式,服务器可以同时与多个客户机建立连接,为多个客户机服务。 服务器接收客户机发来的信息,然后将转发给聊天室的其他客户机,从而实现多个客户机之间的 信息交换。服务器动态统计进入聊天室的客户机数目,并显示出来,及时显示新的客户机进入和退出 聊天室的信息,转发给其他客户机。用户进入服务器程序后,用户应首先输入监听端口号,启动监听 等待客户机的连接请求,当客户机端的连接请求到来时,服务器接收并进入与客户机的会话。

基于Socket接口的网络通信MFC程序设计

在局域网上实现两台计算机相互通信。甲机发送数据,乙机收到后予以显示。局域网中不设置专门的服务器,因此,应采用UDP协议,每台计算机既是服务器,也是客户机。

Java实现网络通信(TCP程序设计)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、TCP网络程序设计是什么?二、TCP网络程序设计原理:1.图示:2.读入数据总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、TCP网络程序设计是什么? TCP网络程序设计是指利用Socket类编写通信程序。 利用TCP协议进行通信的程序有主次之分,一个称为服务器端程序,另一个称为客户端程序 二、TCP网络程序设计原理: 1.图示: 代码如下(示例): import numpy as np import panda

世纪末的架构师的博客 8632

基于GUI的网络通信程序设计JAVA源代码

基于GUI的网络通信程序设计JAVA源代码 client: package gui; //客户端代码 import java.net.*; import java.io.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Client { public sta...

weixin_44112851的博客 2185

网络程序设计:基于Socket和epoll的网络聊天室

该函数用于创建一个套接字。返回值:成功返回文件描述符,失败返回-1domain:协议域,AF_INET代表使用IPv4type:socket类型,代表使用TCP传输protocol:协议,0表示使用默认协议本实验中采用Socket API和epoll实现了可并发的聊天服务器,虽然使用epoll相较于使用select来说代码更加复杂,但是提高了处理的效率。在本学期的网络程序设计中,我对于网络编程有了更深入的认识。

weixin_46108475的博客 1263

Java实验之基于GUI的网络通信程序设计

                                    基于GUI的网络通信程序设计一、实验目的    1.掌握Java中GUI程序的编写,包括事件监听机制。    2.掌握Java的网络通信编程,ServerSocketSocket类的使用。    3.掌握Java中多线程的编程,Thread类,Runnable接口的使用。    4.掌握用面向对象的方法分析和解决复杂问题。二...

sortmin的博客 8742

【C++网络编程】Socket基础:网络通讯程序入门级教程

本篇博文介绍了C++网络编程的基础知识,从Socket基础到Epoll的使用,为初学者提供了入门级的教程。读者将学习如何创建套接字、建立连接、发送和接收数据,并深入了解Epoll在高性能网络编程中的应用。

朝花夕拾 7612
上一篇: Who can tell me why?
下一篇: 比较烦
ustcqi
博客等级 码龄14年 35粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值